我有400个序列图像。 我想从他们创建视频文件(剪辑.. mpeg)
我下载'AForge.NET',我试着查看它是否可能 - 但我不知道如何做到这一点。
我该怎么办?
答案 0 :(得分:8)
Look up the documentation,找到VideoFileWriter Class,查看members,查看WriteVideoFrame method(s),阅读line:"将新视频帧写入当前打开的视频文件。"。答对了。一半在那里。
如果在阅读方法时无法连接点。签名(WriteVideoFrame(Bitmap)
)或者不了解如何使用Open()
overloads或Close()
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”。)
如果还没有工作,请告诉我们发生了什么,完全错误消息等。