问题: Libav/FFmpeg解码流程需要什么才能在解码后的AVFrame中产生有效的呈现时间戳(PTS)?
我正在解码通过RTSP接收到的H264流。我使用Live555来解析H264并将流馈送到我的LibAV解码器。解码和显示工作正常,除了我没有使用时间戳信息并且出现了一些卡顿。
在使用avcodec_decode_video2
获取帧之后,呈现时间戳(PTS)未设置。
我需要PTS以便找出每个帧需要显示的时间长度,并避免任何卡顿。
关于我的流程的注释
- 我通过Live555获取SPS / PPS信息,将这些值复制到我的
AVCodecContext->extradata
中。 - 我还将SPS和PPS作为NAL单元发送到我的解码器,附加了{0,0,0,1}的起始代码。
- Live555为每个数据包提供呈现时间戳,这些时间戳在大多数情况下不是单调递增的。流包含B帧。
- 我的
AVCodecContext->time_base
无效,值为0/2。
不清楚的问题:
- 我应该在哪里设置来自我的H264 sink(Live555)的NAL PTS?作为AVPacket->dts、pts、无,还是两者都有?
- 为什么我的
time_base
值无效?这个信息在哪里? - 根据 RTP负载规范。似乎
RTP时间戳设置为内容的采样时间戳。必须使用90 kHz时钟速率。
- 这是否意味着我必须始终假定解码器的时间基准为1/90000?如果SPS中指定了其他值怎么办?
0/2
。 - Sergio Basurco