使用 IMFSourceReader 对来自麦克风的音频和视频流中的延迟进行编码时会出现噪音

Posted

技术标签:

【中文标题】使用 IMFSourceReader 对来自麦克风的音频和视频流中的延迟进行编码时会出现噪音【英文标题】:Noise occurs while encoding audio from Microphone and latency in video streaming using IMFSourceReader 【发布时间】:2017-04-05 18:05:28 【问题描述】:

我正在开发一个应用程序来在使用 SourceReader 进行视频流传输期间捕获.MP4 文件(视频(USB 摄像头)和音频(任何麦克风))。

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

    录制 10 秒后,fps 变为 0 并恢复到 1fps(注意:保存视频为 1080p 60fps)。 FPS 没有恢复到 60fps。 在播放录制文件时,仅播放整个文件的噪音音频。录制的音频文件未播放。 为了停止记录,我使用了 sinkwriter finalize 方法。我的应用程序没有响应调用此方法,并且此方法需要时间来释放它(释放时间约为 3-5 分钟)。

请在以下 Dropbox 链接中找到我的代码: https://www.dropbox.com/s/eddwdc1z9wsoh04/VideoRecord.txt?dl=0

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

请告诉我是否缺少配置音频和视频的任何内容?帮我解决这个问题。

提前致谢

【问题讨论】:

【参考方案1】:

我发现很少有错误。 首先,您使用 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);

【讨论】:

感谢您的回复,Vuvrit。我已根据您的 cmets 修改了代码。尽管如此,我还是遇到了一个问题,并且已将示例视频放在以下 Dropbox 链接中:dropbox.com/s/62aou1edg5jwblz/VID_2017_0406_20507_0.mp4?dl=0。请看看这个视频,给我任何想法。 请在以下保管箱链接中找到代码:dropbox.com/s/eddwdc1z9wsoh04/VideoRecord.txt?dl=0。昨天我错过了要修改的一件事。现在我已经修改了代码并上传到了 Dropbox。修改代码后,出现流媒体延迟但没有录制音频。 尝试不调整 OnReadSample 中的时间戳。注释 SetSampleTime 行或 llTimestamp -= m_llBaseTime;看看它是否有什么不同。 在评论时间后仍然面临同样的问题。 为了隔离问题,您可以尝试分别仅录制视频 (MF_SOURCE_READER_FIRST_VIDEO_STREAM) 和仅录制音频 (MF_SOURCE_READER_FIRST_AUDIO_STREAM)。在这种情况下,样本索引将为 0:hr = m_pWriter->WriteSample(0, pSample); .让我知道它在这两种情况下是如何工作的。可能问题出在音频媒体类型配置上。

以上是关于使用 IMFSourceReader 对来自麦克风的音频和视频流中的延迟进行编码时会出现噪音的主要内容,如果未能解决你的问题,请参考以下文章

使用 IMFSourceReader 打开视频文件

听到来自麦克风的传入音频

如何通过 IMFSourceReader 使用自定义堆

来自麦克风迭代结果的缓冲流

我将如何使用 NAudio 压缩来自麦克风的传入 PCM 数据?

使用 IMFSourceReader 进行音频流式传输(Microsoft Media Foundation)