如何在C#项目中从单独的图像创建视频文件

时间:2019-06-07 17:32:50

标签: c# .net image video avi

我想从c#列表中创建一个视频文件,该文件可以采用媒体播放器可以打开的任何格式。

我曾经尝试过Aforge和Avi文件包装器,但是不幸的是它们仅在x86中工作,并且我有很多依赖项,因此我不能更改项目类型。因此,必须是x64。

我所有的位图都在一个列表中(大约50个左右)         公共列表tv_ImageData = new List();

我是C#的新手,对自己的方式不太了解。我用谷歌搜索,找不到解决方案。如果有人能指出我正确的方向(或图书馆),我将不胜感激。

2 个答案:

答案 0 :(得分:0)

(我觉得这样比较好些,但我还没有这个声誉。很抱歉,如果这样做不好!)

由于AForge的唯一问题似乎是它是针对x86编译的,因此我将提及它看起来像可以针对x64目标自己重新编译。

https://github.com/andrewkirillov/AForge.NET

快速搜索发现此链接指向包含64位版本的AForge的重新编译:

https://archive.codeplex.com/?p=aforgeffmpeg

我不知道这是否是最新的,所以我建议您自己编译。

希望对您有帮助!

答案 1 :(得分:0)

与SharpAvi混合后,我解决了我的问题。 我有一个名为

的列表
List<ushort[]> tv_data = new List<ushort> tv_data();

其中包含帧作为原始数据(值在0-255范围内)。 我尝试使用文档提供的示例,但是它给了我一个很大的优势(我想是因为SharpAvi希望使用DIB位图)。因此,我对其进行了一些更改,并从这里(How to create bitmap from byte array?)借了一点,以得到一个可行的解决方案。

这是我的功能:

using SharpAvi;
using SharpAvi.Output;

这可能不是最好的方法,但它可以工作。希望有人会发现它有用。

private void SaveAsVideo(object sender, RoutedEventArgs e)
{
    if (loadedFileName != "")
    {
        try
        {
            var writer = new AviWriter(string.Format("{0}.avi", fullPath))
            {
                FramesPerSecond = (decimal)VI.FrameRate,
                EmitIndex1 = true
            };
            var stream = writer.AddVideoStream();
            stream.Width = (int)VI.VideoWidth;
            stream.Height = (int)VI.VideoHeight;
            stream.Codec = KnownFourCCs.Codecs.Uncompressed;
            stream.BitsPerPixel = BitsPerPixel.Bpp8;

            var frameData = new byte[stream.Width * stream.Height];
            int frameNo = 0;
            foreach (ushort[] data in tv_Data)
            {
                byte[] byteData = tv_Data.ElementAt(frameNo);
                byte[] newbytes = PadLines(byteData, stream.Height, stream.Width);
                stream.WriteFrame(true, newbytes, 0, frameData.Length);
                frameNo++;
            }
            writer.Close();
            MessageBox.Show("Video file saved.");
        }
        catch (Exception ex)
        {
            MessageBox.Show(string.Format("Failed to save video. \n {0}", ex.Message));
        }
    }
}
static byte[] PadLines(byte[] bytes, int rows, int columns)
{
    int currentStride = columns;
    int newStride = columns;
    byte[] newBytes = new byte[newStride * rows];
    byte[] tempBytes = new byte[newStride];

    for (int i = 0; i < rows; i++)
    {
        Buffer.BlockCopy(bytes, currentStride * i, tempBytes, 0, currentStride);
        Array.Reverse(tempBytes);
        Buffer.BlockCopy(tempBytes, 0, newBytes, newStride * i, currentStride);
    }
    Array.Reverse(newBytes);
    return newBytes;
}