【问题标题】:Save WPF BitmapSources as h264 encoded video directly from Memory直接从内存中将 WPF BitmapSources 保存为 h264 编码的视频
【发布时间】:2016-12-01 11:15:11
【问题描述】:

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

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

【问题讨论】:

  • 是否可以使用相机作为 NReco ffmpeg 包装器的输入源?如果相机可作为 DirectShow 设备访问,或者如果流由 URL 提供,您可以这样做。这将是对视频进行转码并保存到文件的最有效方式。
  • 我不这么认为。特别是因为我仍然需要能够使用相机在 Aforge 中进行并行图像分析并为用户进行实时预览。通过我提供的解决方案,我认为已经为这个特定用例提供了最佳选择。
  • 如果您在 C# 中将帧作为图像(位图对象),您也可以使用 ConvertLiveMedia 方法(使用特殊的“raw_video”格式)将它们直接推送到 ffmpeg 输入。
  • 我可以尝试-而不是通过Sharpavi发送它,然后我可以直接将它们发送到convertLivemedia。周一会通知你。但是我只将它们作为 WPF BitmapSources - 而不是 Forms Bitmaps。不知道转换是否会消除这种方法的任何好处。
  • 嗨,Daniel,您能否发送将 BitmapSources 保存为 AVI 文件的代码。

标签: c# wpf ffmpeg avi bitmapsource


【解决方案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。

【讨论】:

  • 我现在的问题是,我正在使用 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();
  • 我不确定我是否理解您的问题。您显然必须等待Sharpavi 完成,然后才能将流传递给nreco(或ffmpeg),因为它需要将整个文件表示为一个整体。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 2021-02-09
  • 2012-01-24
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多