我有两个摄像头,如下所列,我正尝试在媒体基础拓扑中使用它们。这是我的拓扑的摘要:
网络摄像头 --> 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,实时源的时间戳应该从 0 开始。
沿着这条线,我尝试了以下方法来“更正”示例时间戳:
- 在我的自定义 MFT 中重新基于采样时间,使用
IMFSample::SetSampleTime
. MEMediaSample
为 IMFMediaSource 和 IMFMediaStream 对象创建了一个包装器,用于捕获并更正与和MEStreamTick
事件关联的时间戳。
在这两种情况下,媒体会话都会引发错误0xC00D4A44
( MF_E_SINK_NO_SAMPLES_PROCESSED
),并且生成的 MP4 文件在“mdat”原子声明之后突然结束。
相机
- 罗技 BCC950 会议摄像机
- Thinkpad W520 集成摄像头
使用的系统(都有相同的问题):
- Windows 7 专业版 x64
- 视窗 8 x86
问题:
- 是否还有其他一些原因我忽略了不正确的视频持续时间/时间尺度?
- 如果没有,是否有正确的方法来重新建立样本时间戳?