1

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

2 回答 2

0

部分回答您的问题:

  • 在图书馆计算“presentationTime”的位置?
  • H264VideoFileSink::afterGettingFrame1 方法“presentationTime”值是否可能有误?
  • 呈现时间基于样本的 RTP 时间戳。
  • 不太可能,我们已经使用 live555 相当长的一段时间没有任何时间戳问题。如果时间戳不正确,我会怀疑 RTP 源(即 RTSP 服务器或摄像头)的时间戳错误。使用wireshark嗅探RTP数据包以查看RTP时间戳然后从那里转换回NTP时间以查看连续帧之间的差异可能会也可能不会有帮助。
于 2011-12-19T09:33:55.220 回答
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,因此您收到的 PTS 为 1 - 根据您的逻辑,它是负数。

于 2011-12-26T12:01:47.973 回答