如何从Images序列文件创建视频文件?

时间:2016-04-20 12:49:11

标签: c# aforge

我有400个序列图像。 我想从他们创建视频文件(剪辑.. mpeg)

我下载'AForge.NET',我试着查看它是否可能 - 但我不知道如何做到这一点。

我该怎么办?

1 个答案:

答案 0 :(得分:8)

Look up the documentation,找到VideoFileWriter Class,查看members,查看WriteVideoFrame method(s),阅读line:"将新视频帧写入当前打开的视频文件。"。答对了。一半在那里。

如果在阅读方法时无法连接点。签名(WriteVideoFrame(Bitmap))或者不了解如何使用Open() overloadsClose() method(为什么你不会,最后两个对于文件I / O来说很常见)你总是Google "VideoFileWriter WriteVideoFrame example"find code,从那里开始。功能的核心是:

VideoFileWriter writer = new VideoFileWriter();
writer.Open("myfile.avi", width, height, 25, VideoCodec.MPEG4, 1000000);
    // ... here you'll need to load your bitmaps
    writer.WriteVideoFrame(image);
}
writer.Close();

所以这样的事情应该可行:

using (VideoFileWriter writer = new VideoFileWriter()) 
{
    writer.Open(@"d:\myfile.avi", 640, 480, 25, VideoCodec.MPEG4);
    foreach (var file in Directory.GetFiles(@"d:\foo\bar", "*.jpg"))
    {
        writer.WriteVideoFrame(Bitmap.FromFile(file) as Bitmap);
    }
    writer.Close();
}

在几分钟的摆弄中,给了我这样的东西:

var size = new Size(1600, 1200);                    // The desired size of the video
var fps = 25;                                       // The desired frames-per-second
var codec = VideoCodec.MPEG4;                       // Which codec to use
var destinationfile = @"d:\myfile.avi";             // Output file
var srcdirectory = @"d:\foo\bar";                   // Directory to scan for images
var pattern = "*.jpg";                              // Files to look for in srcdirectory
var searchoption = SearchOption.TopDirectoryOnly;   // Search Top Directory Only or all subdirectories (recursively)?

using (var writer = new VideoFileWriter())          // Initialize a VideoFileWriter
{
    writer.Open(destinationfile, size.Width, size.Height, fps, codec);              // Start output of video
    foreach (var file in Directory.GetFiles(srcdirectory, pattern, searchoption))   // Iterate files
    {
        using (var original = (Bitmap)Image.FromFile(file))     // Read bitmap
        using (var resized = new Bitmap(original, size))        // Resize if necessary
            writer.WriteVideoFrame(resized);                    // Write frame
    }
    writer.Close();                                 // Close VideoFileWriter
}                                                   // Dispose VideoFileWriter

这会调整图像大小;不应该序列中的所有图像都相同。如果他们 ,只需更改

即可跳过该步骤
using (var original = (Bitmap)Image.FromFile(file))     // Read bitmap
using (var resized = new Bitmap(original, size))        // Resize if necessary
    writer.WriteVideoFrame(resized);                    // Write frame

为:

using (var mybitmap = (Bitmap)Image.FromFile(file))     // Read bitmap
    writer.WriteVideoFrame(mybitmap);                   // Write frame

还要确保添加正确的using语句;您将至少需要以下示例:

using AForge.Video.FFMPEG;
using System.Drawing;
using System.IO;

此外,您还需要按照here所述引用DLL:

  

...你应该已经创建了一个项目,添加了对AForge.Video.FFMPEG库的引用,将目标平台设置为x86,目标框架版本现在设置为3.5或更低。如果是这样,它可以继续。

     

......我们需要更多来自AForge档案馆的dll。您可以在AForge存档中的“Externals \ ffmpeg”文件夹中找到它们。必须将此文件夹中的所有文件复制到Visual Studio项目的输出文件夹中。 (在我们更改目标体系结构之后,现在应该是“YourProjectFolder \ bin \ x86 \ Debug”。)

如果还没有工作,请告诉我们发生了什么,完全错误消息等。