将原始视频/音频帧放入AVI(或其他容器)的最简单方法是什么?

时间:2010-04-06 16:07:48

标签: wpf video directshow

我正在使用WPF MediaKit编写一个小应用程序,我想录制一些视频 - 我的计划是将最后的 n 秒存储为原始音频/视频帧,然后在用户请求时将其写为AVI。

有没有一种简单的方法可以将我从网络摄像头收集的数据实际传输到AVI文件中?诀窍是,我必须使用缓冲数据,我不能直接写一个新的DirectShow场景图来写出AVI文件 - 对于我的应用程序,相机一直在运行,并且用户发出信号结束捕获(我们花费最后几秒左右)。

AVI不必以任何方式压缩,我将通过Expression Encoder运行它来执行此操作。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果要缓冲数据,可以执行以下操作:

  1. 使用SampleGrabber Filter创建捕获图(请参阅Using the Sample Grabber),并将每个传入的IMediaSample中的数据复制到内存缓冲区(帧的循环缓冲区将帮助您限制内存中的大小)。
  2. 用户点击 end 后,创建第二个用于写入文件的图表,将内存缓冲区中的数据输入到样本采集器中。
  3. 一些问题:

    1. 不要保留从SampleGrabber回调中获得的IMediaSample指针。每个DirectShow过滤器图都使用了一个IMediaSamples的内存池,如果你把它们全部拿走,你就会饿死图。
    2. 复制出Media Sample时,请务必使用IMediaSample::GetSize而不是IMediaSample::GetActualDataLength。某些媒体示例在DWORD(4字节)边界上填充,您希望保留它以便写入新的AVI文件。