将WPF BitmapSources直接从内存

时间:2016-12-01 11:15:11

标签: c# wpf ffmpeg avi bitmapsource

目前我正在使用List-variable来存储相机提供的BitmapSources,并在SharpAvi的帮助下将它们保存为AVI文件。在第二步中,我通过Nrecos ffmpeg wrapper对保存的文件进行编码,以减小文件大小。最后,我删除了原始的AVI文件,只保留了编码的文件。

对我而言,这似乎设计得很糟糕,并且可能会导致应用程序运行的SSD出现有害的写入周期(我可能会在未编码的视频中每天创建一个TB),这就是我想要改变的原因它是利用PC的RAM的更集成的解决方案。 然而,SharpAvi以及Nreco依赖于创建和读取实际文件。 Nreco确实有接受流的ConvertLiveMedia方法 - 但是在我的实验中,它根本没有创建文件,同时没有给出错误警告。

1 个答案:

答案 0 :(得分: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。