音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现

=================================================================

音视频入门基础:MPEG2-TS专题系列文章:

音视频入门基础:MPEG2-TS专题(1)------MPEG2-TS官方文档下载

音视频入门基础:MPEG2-TS专题(2)------使用FFmpeg命令生成ts文件

音视频入门基础:MPEG2-TS专题(3)------TS Header简介

音视频入门基础:MPEG2-TS专题(4)------使用工具分析MPEG2-TS传输流

音视频入门基础:MPEG2-TS专题(5)------FFmpeg源码中,判断某文件是否为TS文件的实现

音视频入门基础:MPEG2-TS专题(6)------FFmpeg源码中,获取MPEG2-TS传输流每个transport packet长度的实现

音视频入门基础:MPEG2-TS专题(7)------FFmpeg源码中,读取出一个transport packet数据的实现

音视频入门基础:MPEG2-TS专题(8)------TS Header中的适配域

音视频入门基础:MPEG2-TS专题(9)------FFmpeg源码中,解码TS Header的实现

音视频入门基础:MPEG2-TS专题(10)------PSI、SI简介

音视频入门基础:MPEG2-TS专题(11)------ TS中的Section

音视频入门基础:MPEG2-TS专题(12)------ FFmpeg源码中,把各个transport packet组合成一个Section的实现

音视频入门基础:MPEG2-TS专题(13)------FFmpeg源码中,解析Section Header的实现

音视频入门基础:MPEG2-TS专题(14)------PAT简介

音视频入门基础:MPEG2-TS专题(15)------FFmpeg源码中,解析Program association section的实现

音视频入门基础:MPEG2-TS专题(16)------PMT简介

音视频入门基础:MPEG2-TS专题(17)------FFmpeg源码中,解析TS program map section的实现

音视频入门基础:MPEG2-TS专题(18)------PES流简介

音视频入门基础:MPEG2-TS专题(19)------FFmpeg源码中,解析TS流中的PES流的实现

音视频入门基础:MPEG2-TS专题(20)------ES流简介

音视频入门基础:MPEG2-TS专题(21)------FFmpeg源码中,获取TS流的视频信息的实现

音视频入门基础:MPEG2-TS专题(22)------FFmpeg源码中,获取TS流的音频信息的实现

音视频入门基础:MPEG2-TS专题(23)------通过FFprobe显示TS流每个packet的信息

音视频入门基础:MPEG2-TS专题(24)------FFmpeg源码中,显示TS流每个packet的pts、dts的实现

=================================================================

一、引言

从《音视频入门基础:MPEG2-TS专题(23)------通过FFprobe显示TS流每个packet的信息》中可以知道,通过FFprobe命令可以打印TS流每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts:

本文讲述FFmpeg源码中,上述pts、dts的值是怎样被打印出来的。

二、FFmpeg源码中,显示TS流每个packet的pts、dts的实现

由《音视频入门基础:MPEG2-TS专题(19)------FFmpeg源码中,解析TS流中的PES流的实现》可以知道,FFmpeg源码中通过mpegts_push_data函数解析TS流中的一个PES packet。而mpegts_push_data函数中,通过下面代码块读取PES packet header中的PTS和DTS,分别赋值给变量pes->pts和pes->dts,即赋值给PESContext的pts和dts:

cpp 复制代码
                if ((flags & 0xc0) == 0x80) {
                    pes->dts = pes->pts = ff_parse_pes_pts(r);
                    r += 5;
                } else if ((flags & 0xc0) == 0xc0) {
                    pes->pts = ff_parse_pes_pts(r);
                    r += 5;
                    pes->dts = ff_parse_pes_pts(r);
                    r += 5;
                }

之后当再次进入mpegts_push_data函数时,会调用new_pes_packet函数:

cpp 复制代码
    if (is_start) {
        if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
            ret = new_pes_packet(pes, ts->pkt);
            if (ret < 0)
                return ret;
            ts->stop_parse = 1;
        } else {
            reset_pes_packet_state(pes);
        }
        pes->state         = MPEGTS_HEADER;
        pes->ts_packet_pos = pos;
    }

new_pes_packet函数内部,会把PESContext的pts和dts分别赋值给AVPacket的pts和dts:

cpp 复制代码
static int new_pes_packet(PESContext *pes, AVPacket *pkt)
{
//...
    pkt->pts = pes->pts;
    pkt->dts = pes->dts;
//...
}

最后在fftools/ffprobe.c的show_packet函数中将AVPacket的pts和dts的值打印出来:

cpp 复制代码
static void show_packet(WriterContext *w, InputFile *ifile, AVPacket *pkt, int packet_idx)
{
//...
    print_ts  ("pts",             pkt->pts);
//...
    print_ts  ("dts",             pkt->dts);
//...
}

三、总结

TS流/TS文件中每个packet的PTS和DTS分别来源于该packet的PES packet header中的PTS和DTS。

相关推荐
REDcker9 天前
WebCodecs VideoDecoder 的 hardwareAcceleration 使用
前端·音视频·实时音视频·直播·webcodecs·videodecoder
gihigo19989 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
山河君9 天前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa
音视频牛哥9 天前
Android平台RTMP/RTSP超低延迟直播播放器开发详解——基于SmartMediaKit深度实践
android·人工智能·计算机视觉·音视频·rtmp播放器·安卓rtmp播放器·rtmp直播播放器
qq_416276429 天前
通用音频表征的对比学习
学习·音视频
美狐美颜sdk9 天前
Android全局美颜sdk实现方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美狐美颜sdk
EasyDSS9 天前
私有化部署EasyDSS视频点播能力:全链路视频技术赋能,打造企业级视听新体验
音视频·hls·m3u8·点播技术·智能转码
qq_416276429 天前
DeLoRes——一种通用的音频表征学习新方法(DeLoRes(基于 Barlow Twins 的冗余最小化方法)
学习·音视频
Q_4582838689 天前
从定位到视频:808 + 1078 在各行业的落地实践
音视频
山顶望月川9 天前
实测MiniMax-Hailuo-02:当“开工大吉“变成“无字天书“,国产AI视频模型的能与之不能
人工智能·音视频