我有两个摄像头,如下所列,我正尝试在媒体基础拓扑中使用它们。以下是我的拓扑结构的摘要:
网络摄像头 --> 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 开始。
沿着这条线,我尝试了以下方法来“更正”示例时间戳:
- 使用
IMFSample::SetSampleTime
在我的自定义 MFT 中重新设置采样时间。 - 为 IMFMediaSource 和 IMFMediaStream 对象创建了一个包装器,它捕获并更正与
MEMediaSample
和MEStreamTick
事件关联的时间戳。
在这两种情况下,媒体 session 都会抛出错误 0xC00D4A44
(MF_E_SINK_NO_SAMPLES_PROCESSED
),生成的 MP4 文件在“mdat”原子声明后突然结束。
相机
- 罗技 BCC950 ConferenceCam
- Thinkpad W520 集成摄像头
使用的系统(都有同样的问题):
- Windows 7 专业版 x64
- Windows 8 x86
问题:
- 是否还有其他原因导致我忽略了不正确的视频持续时间/时间尺度?
- 如果没有,是否有正确的方法来重新设置样本时间戳?
最佳答案
尝试为每个样本重置标志 MFSampleExtension_Discontinuity
pSample->SetUINT32( MFSampleExtension_Discontinuity, FALSE );
关于c++ - 更正实时 IMFMediaSource 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16448354/