我修改了OpenRtspClient以便
现在不是将文件写入文件,而是将其收集到队列中,并显示传入时间
然后将h264帧提供给MP4 muxer [Geraint Davies MP4 mux filter]
所以我可以将h264流保存到MP4容器......
但问题是,一些记录的数据[并非全部] 持续时间值错误:
假设10分钟的记录似乎是12小时的流...... VLC在剩余时间播放最后一帧的10分钟。
似乎我将采样时间错误地设置到Muxer中...... 然后我调试并看到时间戳上有正面和负面的戏剧性跳跃......
以下是我设置时间戳的方法:
我看到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
}
我的原因是什么?
答案 0 :(得分:0)
部分回答你的问题:
- 在图书馆计算“presentationTime”的位置?
- H264VideoFileSink :: afterGettingFrame1方法“presentationTime”值是否可能出错?
答案 1 :(得分:0)
如果您遵循MPEG类压缩 - 在视频中,演示时间戳会上下变化。这是因为如果你有I帧和P帧在它们的B帧邻居之前编码,它们依赖于前向和后向。
例如,帧号0,1,2,3可以是I,B,B,P - 但实际上它们被传输时它变为0,3,1,2 - (I,P,B,B )。显然,帧3的PTS(呈现时间戳)>帧1的PTS因此您收到1的PTS - 根据您的逻辑它是负的。