使用IMFSourceReader

时间:2017-04-05 18:05:29

标签: video visual-c++ ms-media-foundation

我正在开发一个应用程序,以便在使用SourceReader的视频流中捕获.MP4文件(视频(USB摄像头)和音频(任何麦克风))。

我的代码为所有API返回成功并能够保存视频。我面临3个问题。

  1. 录制10秒后,fps进入0并恢复到1fps(注意:将视频保存为1080p 60fps)。 FPS没有恢复到60fps。
  2. 播放录制的文件时,噪音仅播放整个文件。录制的音频文件无法播放。
  3. 要停止记录,我使用了sinkwriter finalize方法。我的应用程序没有响应调用此方法和此方法花时间释放它(时间被释放~3-5分钟)。
  4. 请在以下保管箱链接中找到我的代码: https://www.dropbox.com/s/eddwdc1z9wsoh04/VideoRecord.txt?dl=0

    没有任何问题,我能够使用捕获引擎技术捕获音频和视频,但此技术支持Windows 8.我的应用程序必须支持Windows 7。

    请告诉我是否遗漏了配置音频和视频的内容?帮我解决这个问题。

    提前致谢

1 个答案:

答案 0 :(得分:0)

我看到很少的错误。 首先,使用MF_SOURCE_READER_FIRST_VIDEO_STREAM调用ReadSample。这将只读取视频样本。您应该使用MF_SOURCE_READER_ANY_STREAM调用ReadSample(第一次和OnReadSample内部),以使其同时读取视频和音频样本。

其次,以下两行是错误的:

hr = m_pWriter->WriteSample(0, pSample);
hr = m_pWriter->WriteSample(1, pSample);

您应该根据OnReadSample中的dwStreamIndex值调用带有相应流索引的WriteSample。例如,在您的情况下:

if(dwStreamIndex == 0)
    hr = m_pWriter->WriteSample(m_dwVideoStreamIndex, pSample);
else if(dwStreamIndex == 1)
    hr = m_pWriter->WriteSample(m_dwAudioStreamIndex, pSample);