【发布时间】:2011-12-19 07:48:46
【问题描述】:
我修改了 OpenRtspClient 以便
现在我不是将帧写入文件,而是将它们收集到一个队列中,其中包含传入的呈现时间
然后将 h264 帧提供给 MP4 muxer [Geraint Davies MP4 mux filter]
- 终于将混合数据写入文件...
所以我可以将 h264 流保存到 MP4 容器中...
但问题是,一些记录的数据[不是全部] 持续时间的值有误:
假设 10 分钟的记录似乎是 12 小时的流... VLC 播放剩余时间的最后一帧播放的 10 分钟。
看来我在 Muxer 中设置了错误的采样时间... 然后我调试一下,发现时间戳有正负戏剧性的跳跃……
这是我设置时间戳的方法:
- 首先我从 H264VideoFileSink::afterGettingFrame1 函数中获取presentationTime
- 然后计算firstPresentaionTime[开头]
- 然后收集其他时间戳
我看到 frameTimeStamp 值显示出向负值或正值的戏剧性跳跃...[我将这些值保留为 int64 ]
#define TIMEVAL_TO_REFERENCE_TIME(x)
((__int64)(x.tv_sec * 1000000) + x.tv_usec) * 10
void H264VideoFileSink::
afterGettingFrame1(unsigned frameSize, struct timeval presentationTime)
{
// At the beginning [ just for once calculate firstPresentaionTime ]
firstPresentaionTime = TIMEVAL_TO_REFERENCE_TIME(presentationTime);
// for the other frames collect frames timestamps
frameTimeStamp = TIMEVAL_TO_REFERENCE_TIME(presentationTime) -
firstPresentationTime
}
这是什么原因?
- 或者将这个“presentationTime”用于 MP4 Muxer 是否是个好主意?
- 图书馆的“presentationTime”在哪里计算?
- H264VideoFileSink::afterGettingFrame1 方法的“presentationTime”值是否可能有误?
- 有人在 mp4 容器中录制 h264 流并想分享他/她的经验吗?
【问题讨论】:
-
我通常建议将您的问题拆分成可以回答的更简单的部分。
标签: directshow h.264 mp4 live555