c++ - 更正实时 IMFMediaSource 时间戳

标签 c++ windows winapi video ms-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 在我的自定义 MFT 中重新设置采样时间。
  2. 为 IMFMediaSource 和 IMFMediaStream 对象创建了一个包装器,它捕获并更正与 MEMediaSampleMEStreamTick 事件关联的时间戳。

在这两种情况下,媒体 session 都会抛出错误 0xC00D4A44(MF_E_SINK_NO_SAMPLES_PROCESSED),生成的 MP4 文件在“mdat”原子声明后突然结束。


相机

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

使用的系统(都有同样的问题):

  • Windows 7 专业版 x64
  • Windows 8 x86

问题:

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

最佳答案

尝试为每个样本重置标志 MFSampleExtension_Discontinuity

pSample->SetUINT32( MFSampleExtension_Discontinuity, FALSE );

关于c++ - 更正实时 IMFMediaSource 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16448354/

相关文章:

c++ - 如何为 adobe air(或 flex)编写 c/c++ 扩展

c++ - 检查 std::cin operator>> 是否读取了整行

c++ - 为什么需要void_t检查成员类型的存在?

c++ - Qt 在 Linux 上不显示 PNG 图像

python - teamplayer 和 pyhook 奇怪地相互作用

具有引用返回类型的 C++ 类成员函数

c++ - Windows - USB 控制请求问题

c++ - endl 不适用于 wstring (unicode)

c++ - 在关闭程序之前等待 x 秒 C++

c++ - 多窗口程序