当前位置: 首页 > 知识库问答 >
问题:

解码H264/RTSP流后未设置PTS

商嘉木
2023-03-14

问题:Libav/FFmpeg解码管道需要什么才能在解码的AVFrames中生成有效的表示时间戳(PTS)?

我正在解码通过RTSP接收的H264流。我使用Live555解析H264并将流提供给我的LibAV解码器。解码和显示效果很好,只是我没有使用时间戳信息,而且有些口吃。

获取带有avcodec_decode_video2的帧后,不设置演示时间戳(PTS)。

我需要PTS,以找出每帧需要显示多长时间,并避免任何口吃。

  • 我通过Live555获取SPS/PPS信息,我将这些值复制到我的AVCodecContext-
  • 我应该在哪里设置来自我的H264接收器(Live555)的NAL PTS?作为AVPacket-

RTP时间戳设置为内容的采样时间戳。必须使用90 kHz的时钟频率。

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

共有2个答案

施茂
2023-03-14

avcodec_decode_video2()对帧进行重新排序,使解码顺序和呈现顺序相同。即使您以某种方式说服ffmpeg在解码帧上为您提供PTS,它也应该与DTS相同。

//
// decode a video frame
//

avcodec_decode_video2
(
    ctxt->video_st->codec,
    frame,
    &is_finished,
    buffer
);

if (buffer->dts != AV_NOPTS_VALUE)
{
    //
    // you should end up here
    //
    pts = buffer->dts;
}
else
{
    pts = 0;
}

//
// adjust time base
//
pts *= av_q2d(ctxt->video_st->time_base);
夔波
2023-03-14

将live555脚本复制到avpack脚本中。用avcodec_decode_video2处理数据包,然后从avframe-

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

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

将AVPack解码为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

 类似资料:
  • 我正在尝试获取关于h264位流中帧的信息。特别是宏块的运动矢量。我想,我不得不为它使用ffmpeg代码,但它真的很庞大,很难理解。那么,有没有人可以给我一些从h264流的单帧原始数据中进行部分解码的技巧或Exapms? 谢谢你。

  • 我需要一些解码器在rtsp视频流的帮助。我从AXIS IP摄像机那里得到的。我使用了ffmpeg库。必须单独创建AVCodecContext,而不是从AVFormatContext->Streams[...]->Codec; 所以我创建AVCodec、AVCOdecContext并尝试初始化它们。 然后在应用程序的主循环中,获取帧数据并尝试解码: 这里我在控制台中得到了很多消息: 你能给我一些建议

  • 我正在使用对三星S6上的h264流进行解码,发现mediacodec的输入缓冲区必须以“0001”开头(并且不需要设置pps、sps),否则ACodec将报告错误。 我也尝试使用mediaextractor播放一个mp4文件,它工作良好,但缓冲区到mediacodec不是以“0001”开始。 我不知道为什么decodec一个h264流有这样的限制,目前我需要从socket分析流,并将数据切割成小包

  • 这是我对线下的后续问题 Android Lollipop 5.0.2上慢速H264 1080p@60fps解码 在调试上述问题的根本原因的过程中,我尝试了各种方法以60 fps的速度解码1080p。 > 我尝试将H264数据包装到MP4容器中(不进行代码转换)。各种库存播放器的MP4播放速度都比较慢(60fps以下,42fps左右)。 我尝试使用来自Android NDK的本机编解码器示例。还是没

  • 我有一个项目,我被要求在android中显示一个视频流,该流是原始的H.264,我正在连接到一个服务器,并将从服务器接收一个字节流。 基本上,我想知道有没有一种方法可以将原始字节发送到android的解码器并显示在Surface上? 我使用Android4.1中新的MediaCodec和MediaExtractor API成功地解码了包装在mp4容器中的H264,不幸的是,我没有找到使用这些API

  • 我从服务器接收到h264数据,我想在Android上使用mediacodec和texture view对该流进行解码。我从服务器获取数据,解析它得到SPS、PPS和视频帧数据,然后我将该数据传递给mediacodec,但函数dequeueOutputBuffer(info,100000)总是返回-1,并且我得到dequeueOutputBuffer超时。 请帮忙,我三周来一直在忙这个问题。 这是用