基于FFmpeg源码分析TS数据格式的解析

本文分析了TS(Transport Stream)数据格式,解释了TS、PES和ES的关系,强调了PAT和PMT在解析过程中的作用。通过PID的关联找到音视频数据流,并介绍了FFmpeg在mpegts.c文件中如何处理TS包,解析PTS和DTS,获取原始ES数据。对比.ts和.264文件,展示了TS流解析的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因:前面简单分析了FFmpeg针对HLS协议和m3u8文件的简单调用,但是TS数据流的解析却没有介绍,故在此介绍一下TS流的数据格式及解析.

概况:ts(transport stream)可以简单理解为传输文件,内部封装pes(packet elemental stream),而pes内部封装es(elemental stream)数据,而我们用于解码的数据即原始的es数据。可以简单理解为pes比pes多了一些数据头,而数据头内部包含了pts和dts等信息。故重点就是如何找到es数据的起始地址。

流程介绍:为了想要找到es数据,首先需要了解PAT表和PMT表,PAT(program association table)节目关联表:内部包含 TS流中所有的节目。PMT(program map table)节目映射表:内部包含对应节目中包含的音视频数据流描述信息。那么如何关联PAT和PMT以及真实数据流?那么就使用到了PID。

TS包类型解析如下:总共占用4个字节.重点就是获取pid数据,通过获取的pid可以得ts包类型.

typedef struct transport_packet
{
//占用8bit,同步字节,默认为0x47
	unsigned sync_byte : 8;
//占用1bit,传输错误指示位,1:表示传输包中至少有一个不可纠正的错误位,一般为0.
	unsigned transport_error_indicator : 1;
//占用1bit,负载单元起始标识位,1:表示起始数据 0:表示累加数据.一个TS包固定为188字节,而一帧数据将会被分割为多个包,故通过起始标识符可以得知是否为新的数据帧.
	unsigned payload_unit_start_indicator : 1;
//占用1bit,传输优先级
	unsigned transport_priority : 1;
//占用13bit,pid	
    unsigned PID : 13;
//占用2bit,加密标识.一般为00	
    unsigned transport_scrambling_control : 2;
//占用2bit,负载自适应字节标识符.00:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值