2016-12-01 67 views
1

目前我正在利用List-variable来存储相机提供的BitmapSources,并借助SharpAvi将它们保存为AVI文件。在第二步中,我通过Nrecos ffmpeg wrapper编码保存的文件以减小文件大小。最后,我删除原始的AVI文件,只保留编码的文件。将WPF BitmapSources另存为h264编码的视频直接从内存中

对我来说,这似乎设计得不好,可能会导致应用程序运行在SSD上的有害写周期(我可能会在未编码视频中每天创建高达TB的TB),这就是为什么我想改变它的原因到使用PC的RAM更集成的解决方案。然而,SharpAvi和Nreco都依赖创建和阅读实际文件。 Nreco确实有接受流的ConvertLiveMedia方法 - 但是在我的实验中,它并没有创建文件,同时也没有给出错误警告。

+0

是否可以使用相机作为NReco ffmpeg包装的输入源?如果相机可以作为DirectShow设备访问,或者流由URL提供,则可以这样做。这将是转码视频并保存到文件的最有效方式。 –

+0

我不这么认为。特别是因为我仍然需要能够在Aforge中使用相机进行并行图像分析并为用户提供实时预览。通过我提供的解决方案,我认为为这个特定的用例提供了最好的选择。 –

+1

如果您在C#(位图对象)中将帧作为图像,则还可以使用ConvertLiveMedia方法(使用特殊的“raw_video”格式)将它们直接推送到ffmpeg输入。 –

回答

1

好吧我想我解决了它: 我改变了SharpAvi代码,以便AviWriter有一个额外的构造函数接受一个MemoryStream而不是一个字符串。然后将此MemoryStream传递给BinaryWriter,并且不创建FileStream。

此外,必须更改close方法,以便即使在BinaryWriter关闭时MemoryStream仍保持活动状态。 fileWriter.Close被替换

if (fileWriter.BaseStream is MemoryStream) 
    fileWriter.Flush(); 
else 
    fileWriter.Close(); 

这让我在我的主应用程序可用的MemoryStream。

memstream.Position = 0; //crucial or otherwise ffmpeg will not work 
var task = nrecoconverter.ConvertLiveMedia(memstream, "avi", filepath, "avi", settings); 
task.Start(); 
task.Wait(); 

编辑:SharpAvi已正式在github上更改为允许现在使用Streams。

+0

现在我的问题是,我正在使用AviWriter MemoryStream方法,但我不确定如何让NReco马上进行转换,而不是等待SharpAvi完成录制。所以我在我的主录音完成后我做了 'rec.Dispose(); byte [] file = File.ReadAllBytes(outfile);MemoryStream aStream = new MemoryStream(file); aStream.Position = 0; var task = conv.ConvertLiveMedia(aStream,“avi”,outfile,“mp4”,s); task.Start(); task.Wait();' –

+0

我不知道我明白你的问题是什么。您显然必须等待sharpavi完成才能将流传递给nreco(或ffmpeg),因为它需要将整个文件表示为整体。 –