更正实时IMFMediaSource时间戳

时间:2013-05-08 19:08:20

标签: c++ windows winapi video ms-media-foundation

我有两个相机,如下所示,我试图在Media Foundation拓扑中使用。以下是我的拓扑结构摘要:

网络摄像头 - > MJPG解码器 - >自定义MFT - > H264编码器 - > MP4文件接收器

问题在于,生成的MP4文件的持续时间和时间刻度标记都不正确,这两个标记都适用于MP4容器和H264流。我可以使用像MP4Box或YAMB这样的工具轻松纠正这个问题,但我最终的目标是流式传输视频。

我发现的一个潜在原因是相机源生成的样本不会在时间0开始。根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms700134(v=vs.85).aspx#live_sources中的子弹#2,实时源的时间戳应该从0开始。

沿着这一行,我尝试了以下方法来“纠正”样本时间戳:

  1. 使用IMFSample::SetSampleTime
  2. 在我的自定义MFT中重新设置采样时间
  3. 为IMFMediaSource和IMFMediaStream对象创建了一个包装器,用于捕获和更正与MEMediaSampleMEStreamTick事件关联的时间戳。
  4. 在这两种情况下,媒体会话都会抛出错误0xC00D4A44MF_E_SINK_NO_SAMPLES_PROCESSED),并且在“mdat”原子声明之后,生成的MP4文件会突然结束。


    照相机

    • 罗技BCC950 ConferenceCam
    • Thinkpad W520集成摄像头

    使用的系统(两者都有相同的问题):

    • Windows 7 Professional x64
    • Windows 8 x86

    问题:

    1. 我是否因为视频时长/时间尺度错误而忽略了其他原因?
    2. 如果没有,是否有正确的方法来重新设定样本时间戳?

1 个答案:

答案 0 :(得分:1)

尝试重置每个样本标志MFSampleExtension_Discontinuity

pSample->SetUINT32( MFSampleExtension_Discontinuity, FALSE );