C++ 更正实时IMFMediaSource时间戳 我有两个摄像机,下面是我试图在一个媒体基础拓扑中使用的。以下是我的拓扑结构摘要:

C++ 更正实时IMFMediaSource时间戳 我有两个摄像机,下面是我试图在一个媒体基础拓扑中使用的。以下是我的拓扑结构摘要:,c++,windows,winapi,video,ms-media-foundation,C++,Windows,Winapi,Video,Ms Media Foundation,网络摄像头-->MJPG解码器-->自定义MFT-->H264编码器-->MP4文件接收器 问题是生成的MP4文件具有不正确的持续时间和时间刻度标记,无论是对于MP4容器还是H264流。我可以用MP4Box或YAMB这样的工具轻松地纠正这个问题,但我的最终目标是流式播放视频 我已经确定的一个潜在原因是相机源生成的样本不是在时间0开始的。根据中的项目符号#2,活动源的时间戳应该从0开始 沿着这条路线,我尝试了以下方法来“更正”样本时间戳: 使用IMFSample::SetSampleTime在我的

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

问题是生成的MP4文件具有不正确的持续时间和时间刻度标记,无论是对于MP4容器还是H264流。我可以用MP4Box或YAMB这样的工具轻松地纠正这个问题,但我的最终目标是流式播放视频

我已经确定的一个潜在原因是相机源生成的样本不是在时间0开始的。根据中的项目符号#2,活动源的时间戳应该从0开始

沿着这条路线,我尝试了以下方法来“更正”样本时间戳:

  • 使用
    IMFSample::SetSampleTime
    在我的自定义MFT中重新计算采样时间
  • 为IMFMediaSource和IMFMediaStream对象创建了一个包装器,它捕获并更正与
    MEMediaSample
    MEStreamTick
    事件关联的时间戳
  • 在这两种情况下,媒体会话都会抛出一个错误
    0xC00D4A44
    MF\u E\u SINK\u NO\u SAMPLES\u PROCESSED
    ),生成的MP4文件在“mdat”atom声明后突然结束


    摄像机

    • 罗技BCC950会议室
    • Thinkpad W520集成摄像头

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

    • Windows7专业版x64
    • Windows 8 x86

    问题:

  • 视频持续时间/时间尺度不正确是否还有其他原因我忽略了?
  • 如果没有,是否有正确的方法重新设置样本时间戳的基础?

  • 尝试为每个采样标志MFSampleExtension\u不连续性重置

    pSample->SetUINT32( MFSampleExtension_Discontinuity, FALSE );
    

    尝试为每个采样标志MFSampleExtension\u不连续性重置

    pSample->SetUINT32( MFSampleExtension_Discontinuity, FALSE );