H264流的错误演示时间[Live555 OpenRtspClient]

时间:2011-12-19 07:48:47

标签: directshow h.264 mp4 live555

我修改了OpenRtspClient以便

  • 现在不是将文件写入文件,而是将其收集到队列中,并显示传入时间

  • 然后将h264帧提供给MP4 muxer [Geraint Davies MP4 mux filter]

  • 最后将多路复用数据写入文件......

所以我可以将h264流保存到MP4容器......

  

但问题是,一些记录的数据[并非全部]   持续时间值错误:

假设10分钟的记录似乎是12小时的流...... VLC在剩余时间播放最后一帧的10分钟。

似乎我将采样时间错误地设置到Muxer中...... 然后我调试并看到时间戳上有正面和负面的戏剧性跳跃......

以下是我设置时间戳的方法:

  • Firts我从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流并希望分享他/她的经历吗?

2 个答案:

答案 0 :(得分:0)

部分回答你的问题:

  
      
  • 在图书馆计算“presentationTime”的位置?
  •   
  • H264VideoFileSink :: afterGettingFrame1方法“presentationTime”值是否可能出错?
  •   
  • 演示时间基于样本的RTP时间戳。
  • 不太可能,我们已经使用live555很长一段时间而没有任何时间戳问题。如果时间戳不正确,我会怀疑RTP源(即RTSP服务器或摄像头)的时间戳是错误的。使用wireshark嗅探RTP数据包以查看RTP时间戳然后从那里转换回NTP时间以查看连续帧之间的差异可能有用也可能没有帮助。

答案 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 - 根据您的逻辑它是负的。