gpt4 book ai didi

c++ - 解码 H264/RTSP 流后未设置 PTS

转载 作者:太空狗 更新时间:2023-10-29 22:56:59 25 4
gpt4 key购买 nike

问题: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。

不清楚:

  • 我应该在哪里设置来 self 的 H264 接收器 (Live555) 的 NAL PTS?作为 AVPacket->dts、pts、none 或两者?
  • 为什么我的 time_base 值无效?这些信息在哪里?
  • 根据 RTP payload spec .看来

The RTP timestamp is set to the sampling timestamp of the content. A 90 kHz clock rate MUST be used.

  • 这是否意味着我必须始终为解码器假设 1/90000 时基?如果 SPS 中指定了其他值怎么办?

最佳答案

将 live555 pts 复制到 avpacket pts 中。使用 avcodec_decode_video2 处理数据包,然后从 avframe->pkt_pts 中检索 pts,这些将单调递增。

除了在 AVCodecContex extradata 中设置 SPS 和 PPS 之外,无需在编解码器上下文中设置任何内容

你可以在VLC的github中找到一个很好的例子:设置 AVPacket 点:https://github.com/videolan/vlc/blob/master/modules/codec/avcodec/video.c#L983

将 AVPacket 解码为 AVFrame:https://github.com/videolan/vlc/blob/master/modules/codec/avcodec/video.c#L1014

从 AVFrame 中检索点: https://github.com/videolan/vlc/blob/master/modules/codec/avcodec/video.c#L1078

关于c++ - 解码 H264/RTSP 流后未设置 PTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46358285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com