Exemplo n.º 1
0
        void MakeAvi()
        {
            MjpegIterator mjpeg = new MjpegIterator("temp.avi");

            MjpegAviRecorder.Write("output.avi", mjpeg, uint.Parse(textBox3.Text));
            mjpeg.Close();
            File.Delete("temp.avi");
            File.Move("output.avi", "temp.avi");
        }
        static void appendFrames(FileStream fs, MjpegIterator mjpeg)
        {
            mjpeg.MoveTo(0);

            ulong nbr_of_jpgs = (ulong)mjpeg.Count;

            while (!mjpeg.Eof())
            {
                var len = mjpeg.CurrentMem.Length;

                fs.WriteAsByteArray("00db");
                fs.fwrite_DWORD((uint)len);

                var bb = mjpeg.CurrentMem.ToArray();
                fs.Write(bb, 0, bb.Length);
                if (bb.Length % 2 != 0)
                {
                    fs.WriteByte(0);
                }
                if (!mjpeg.Next())
                {
                    break;
                }
            }

            ulong AVI_KEYFRAME = 16;
            ulong offset_count = 4;
            ulong index_length = 4 * 4 * nbr_of_jpgs;

            fs.WriteAsByteArray("idx1");
            fs.fwrite_DWORD((uint)index_length);

            mjpeg.MoveTo(0);

            while (!mjpeg.Eof())
            {
                var len = mjpeg.CurrentMem.Length;
                if (len % 2 != 0)
                {
                    len++;
                }

                fs.WriteAsByteArray("00db");

                fs.fwrite_DWORD((uint)AVI_KEYFRAME);
                fs.fwrite_DWORD((uint)offset_count);
                fs.fwrite_DWORD((uint)len);
                offset_count += (uint)(len + 8);
                if (!mjpeg.Next())
                {
                    break;
                }
            }
        }
        static ulong get_all_sizes(MjpegIterator mjpeg)
        {
            ulong sizes = 0;

            mjpeg.MoveTo(0);
            while (!mjpeg.Eof())
            {
                var len = mjpeg.CurrentMem.Length;
                if (len % 2 != 0)
                {
                    len += 1;
                }
                sizes += (ulong)len;
                if (!mjpeg.Next())
                {
                    break;
                }
            }
            return(sizes);
        }
        public static void Write(string path, MjpegIterator mjpeg, ulong fps)
        {
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            FileStream fs          = new FileStream(path, FileMode.CreateNew, FileAccess.Write);
            var        bmp         = mjpeg.Image();
            ulong      count       = (ulong)mjpeg.Count;
            var        jpgs_width  = bmp.Width;
            var        jpgs_height = bmp.Height;

            bmp.Dispose();


            fs.WriteAsByteArray("RIFF");

            var len             = get_all_sizes(mjpeg);
            var RIFF_LISTdwSize = (uint)(150 + 12 + len + 8 * count + 8 + 4 * 4 * count);

            fs.fwrite_DWORD(RIFF_LISTdwSize);
            fs.WriteAsByteArray("AVI ");
            fs.WriteAsByteArray("LIST");

            fs.fwrite_DWORD(208);
            fs.WriteAsByteArray("hdrl");
            fs.WriteAsByteArray("avih");

            fs.fwrite_DWORD(56);
            var avihdwMicroSecPerFrame = (uint)(1000000 / fps);

            fs.fwrite_DWORD(avihdwMicroSecPerFrame);

            var avihdwMaxBytesPerSec = 7000;

            fs.fwrite_DWORD((uint)avihdwMaxBytesPerSec);

            var avihdwPaddingGranularity = 0;

            fs.fwrite_DWORD((uint)avihdwPaddingGranularity);


            fs.fwrite_DWORD((uint)16);
            fs.fwrite_DWORD((uint)count);
            fs.fwrite_DWORD((uint)0);
            fs.fwrite_DWORD((uint)1);

            fs.fwrite_DWORD((uint)0);
            fs.fwrite_DWORD((uint)jpgs_width);
            fs.fwrite_DWORD((uint)jpgs_height);
            fs.fwrite_DWORD((uint)0);
            fs.fwrite_DWORD((uint)0);
            fs.fwrite_DWORD((uint)0);
            fs.fwrite_DWORD((uint)0);

            fs.WriteAsByteArray("LIST");

            fs.fwrite_DWORD((uint)132);

            fs.WriteAsByteArray("strl");
            fs.WriteAsByteArray("strh");

            fs.fwrite_DWORD(48);
            fs.WriteAsByteArray("vids");
            fs.WriteAsByteArray("MJPG");

            fs.fwrite_DWORD(0);
            fwrite_WORD(fs, 0);
            fwrite_WORD(fs, 0);
            fs.fwrite_DWORD(0);
            fs.fwrite_DWORD(1);

            fs.fwrite_DWORD((uint)fps);
            fs.fwrite_DWORD(0);
            fs.fwrite_DWORD((uint)count);
            fs.fwrite_DWORD(0);
            fs.fwrite_DWORD(0);

            fs.fwrite_DWORD(0);
            fs.WriteAsByteArray("strf");

            fs.fwrite_DWORD(40);
            fs.fwrite_DWORD(40);
            fs.fwrite_DWORD((uint)jpgs_width);
            fs.fwrite_DWORD((uint)jpgs_height);
            fwrite_WORD(fs, 1);
            fwrite_WORD(fs, 24);

            if (mjpeg.Format == ImageFormat.Png)
            {
                fs.WriteAsByteArray("MPNG");
            }
            if (mjpeg.Format == ImageFormat.Jpeg)
            {
                fs.WriteAsByteArray("MJPG");
            }

            var strfbiSizeImage = ((jpgs_width * jpgs_height / 8 + 3) & 0xFFFFFFFC) * jpgs_height;

            fs.fwrite_DWORD((uint)strfbiSizeImage);
            fs.fwrite_DWORD(0);
            fs.fwrite_DWORD(0);
            fs.fwrite_DWORD(0);
            fs.fwrite_DWORD(0);

            fs.WriteAsByteArray("LIST");

            fs.fwrite_DWORD(16);

            fs.WriteAsByteArray("odml");
            fs.WriteAsByteArray("dmlh");

            fs.fwrite_DWORD(4);
            fs.fwrite_DWORD((uint)count);
            fs.WriteAsByteArray("LIST");

            var movidwSize = len + 4 + 8 * count;

            fs.fwrite_DWORD((uint)movidwSize);

            fs.WriteAsByteArray("movi");
            appendFrames(fs, mjpeg);
            fs.Close();
            fs.Dispose();
        }