You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FFmpeg的libavcodec解码后如何获取真实的PTS和DTS?

FFmpeg解码后帧PTS/DTS为AV_NOPTS_VALUE的问题分析与解决

核心原因

av_parser_parse2仅负责将输入字节流拆分出完整的AVPacket,但它不会自动把你传入的pts/dts赋值给输出的_packet_encoded_frame。你传入的那两个时间戳参数只是给解析器内部做逻辑参考用的,并非直接写入packet的字段,这是最容易踩的坑。

正确操作步骤

你需要手动把传入解析器的pts和dts赋值给输出的AVPacket,具体步骤如下:

  • 调用av_parser_parse2之后,先判断输出的_packet_encoded_frame是否有效(即_packet_encoded_frame->size > 0),如果有效,直接给packet的pts和dts字段赋值:
if (_packet_encoded_frame->size > 0) {
    _packet_encoded_frame->pts = pts ? pts : AV_NOPTS_VALUE;
    _packet_encoded_frame->dts = dts ? dts : AV_NOPTS_VALUE;
}
  • 完成赋值后再调用avcodec_send_packet和avcodec_receive_frame,此时解码后的_frame->pts和_frame->pkt_dts就会正确继承packet的时间戳(前提是你原始的pts/dts本身合法有效)。

额外注意点

  • 如果是H.264/H.265这类带B帧的视频格式,解码后的帧pts可能和packet的pts不一致,这是解码器正常的帧重排序行为(B帧需要参考前后帧,解码顺序和显示顺序不同),此时_frame->pts是显示时间戳,_frame->pkt_dts是解码时间戳,均为正确值。
  • 要确保你的AVCodecContext初始化正确,比如设置了对应的codec_id、time_base等参数,错误的上下文配置也可能导致时间戳丢失。
  • 调用av_parser_parse2时传入的pts/dts要基于正确的时间基准(time_base),否则就算赋值成功,后续处理也会出现问题。

内容的提问来源于stack exchange,提问作者Elija

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:25:14