我修改了 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 contianer 中录制 h264 流并想分享他/她的经验吗?