0

我正在尝试从图像创建电影。我正在关注以下链接: https : //www.leadtools.com/support/forum/posts/t11084-//在这里我正在尝试提到的选项 2 & https://social.msdn.microsoft.com/Forums/sqlserver/ en-US/b61726a4-4b87-49c7-b4fc-8949cd1366ac/visual-c-visual-studio-2017-how-do-you-convert-jpg-images-to-video-in-visual-c?forum=csharpgeneral

void convert()
 {
                bmp = new Bitmap(320, 240, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                // create sample source object
                SampleSource smpsrc = new SampleSource();
                ConvertCtrl convertCtrl = new ConvertCtrl();

                // create a new media type wrapper
                MediaType mt = new MediaType();

                double AvgTimePerFrame = (10000000 / 15);

                // set the type to 24-bit RGB video
                mt.Type = Constants.MEDIATYPE_Video;
                mt.SubType = Constants.MEDIASUBTYPE_RGB24;

                // set the format
                mt.FormatType = Constants.FORMAT_VideoInfo;

                VideoInfoHeader vih = new VideoInfoHeader();
                int bmpSize = GetBitmapSize(bmp);

                // setup the video info header
                vih.bmiHeader.biCompression = 0; // BI_RGB
                vih.bmiHeader.biBitCount = 24;
                vih.bmiHeader.biWidth = bmp.Width;
                vih.bmiHeader.biHeight = bmp.Height;
                vih.bmiHeader.biPlanes = 1;
                vih.bmiHeader.biSizeImage = bmpSize;
                vih.bmiHeader.biClrImportant = 0;
                vih.AvgTimePerFrame.lowpart = (int)AvgTimePerFrame;
                vih.dwBitRate = bmpSize * 8 * 15;

                mt.SetVideoFormatData(vih, null, 0);

                // set fixed size samples matching the bitmap size
                mt.SampleSize = bmpSize;
                mt.FixedSizeSamples = true;

                // assign the source media type
                smpsrc.SetMediaType(mt);

                // select the LEAD compressor
                convertCtrl.VideoCompressors.MCmpMJpeg.Selected = true;


                convertCtrl.SourceObject = smpsrc;

                convertCtrl.TargetFile = @"D:\Projects\LEADTool_Movie_fromImage\ImageToVideo_LeadTool\ImageToVideo_LeadTool\Images\Out\aa.avi";
                //convertCtrl.TargetFile = "C:\\Users\\vipul.langalia\\Documents\\count.avi";
                convertCtrl.TargetFormat = TargetFormatType.WMVMux;
                convertCtrl.StartConvert();

                 BitmapData bmpData;
            int i = 1;
            byte[] a = new byte[bmpSize];
            System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height);
            var imgs = GetAllFiles();
            foreach (var item in imgs)
            {
                bmpSize = GetBitmapSize(item);

                MediaSample ms = smpsrc.GetSampleBuffer(30000);
                ms.SyncPoint = true;


                bmpData = item.LockBits(rect, ImageLockMode.ReadWrite, item.PixelFormat);
                Marshal.Copy(bmpData.Scan0, a, 0, bmpSize);
                item.UnlockBits(bmpData);

                ms.SetData(bmpSize, a);

                  SetSampleTime(ms, i, AvgTimePerFrame);
                smpsrc.DeliverSample(1000, ms);

                i++;

            }

                 smpsrc.DeliverEndOfStream(1000);
                 }

                 byte[] GetByteArrayFroMWritableBitmap(WriteableBitmap bitmapSource)
        {
            var width = bitmapSource.PixelWidth;
            var height = bitmapSource.PixelHeight;
            var stride = width * ((bitmapSource.Format.BitsPerPixel + 7) / 8);

            var bitmapData = new byte[height * stride];

            bitmapSource.CopyPixels(bitmapData, stride, 0);
            return bitmapData;
        }

        private int GetBitmapSize(WriteableBitmap bmp)
        {
            int BytesPerLine = (((int)bmp.Width * 24 + 31) & ~31) / 8;
            return BytesPerLine * (int)bmp.Height;
        }

        private int GetBitmapSize(Bitmap bmp)
        {
            int BytesPerLine = ((bmp.Width * 24 + 31) & ~31) / 8;
            return BytesPerLine * bmp.Height;
        }

执行 ms.SetData(bmpSize, a); 时抛出内存异常;陈述。另外,如果我直接通过 var a = System.IO.File.ReadAllBytes(imagePath); 传递 byte[] 在 ms.SetData(bmpSize, a); 声明那么它不会抛出错误,但视频文件没有正确创建。

有人可以帮我吗?

4

1 回答 1

0

您的代码有几个问题:

  1. 您所有的图像都是 320x240 像素吗?如果没有,您应该在将它们作为视频样本传送到转换控件之前将它们调整为这些确切的尺寸。如果你想使用不同的尺寸,你可以,但它应该是所有图像的相同尺寸,你应该相应地修改代码。
  2. 您将 TargetFormat 属性设置为 WMVMux,但输出文件的名称具有“.avi”扩展名。如果要保存 AVI 文件,请设置 TargetFormat = TargetFormatType.AVI。

如果您在此之后仍然遇到问题,请随时联系 support@leadtools.com 并提供有关您尝试过的操作以及遇到的错误的完整详细信息。LEADTOOLS SDK 所有者和免费评估用户均可免费获得电子邮件支持。

于 2020-01-02T18:11:51.667 回答