直接从内存中将 WPF BitmapSource 保存为 h 264 编码视频

Save WPF BitmapSources as h264 encoded video directly from Memory

目前我正在使用一个列表变量来存储相机提供的BitmapSources,并在SharpAvi. In a second step I then encode the saved file via Nrecos ffmpeg wrapper的帮助下将它们保存为AVI文件以减小文件大小。最后我删除了原来的AVI文件,只保留编码后的文件。

对我来说,这似乎设计不佳,可能会对应用程序 运行 上的 SSD 造成有害的写入周期(我可能每天在未编码视频中创建多达 TB),这就是为什么我想将其更改为利用 PC RAM 的更集成的解决方案。 然而,SharpAvi 和 Nreco 依赖于创建和读取实际文件。 Nreco 确实有接受流的 ConvertLiveMedia 方法 - 但是在我的实验中它根本没有创建文件,同时没有给我任何错误警告。

好的,我想我已经解决了: 我更改了 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。