您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
pat格式(详解TS协议(包括超强EasyIce工具介绍))
数据,视频,表示pat格式(详解TS协议(包括超强EasyIce工具介绍))
发布时间:2020-12-06加入收藏来源:互联网点击:
-
。
打包 ts 流时 PAT 和 PMT 表(属于文本数据)是没有 adaptation field,不够的⻓度直接补 0xff 即可。视频流和⾳频流都需要加 adaptation field,即文本数据不需要adaptation field,音视频数据需要adaptation field。一般在⼀个帧的第⼀个 ts包和最后⼀个 ts 包⾥加adaptation field,中间的 ts 包不加adaptation field。所以adaptation field是灵活改变,如下图所示:
PAT 格式如下图所示:
PAT表所对应的字段如下表所示,重点关注表中红色框框部分,table_id就是PAT默认的pid,默认值为0。program_number表示当节目号为0x0001时,是PMT。PID对应的值就是去寻找PMT表的依据。CRC32,表示校验码,用于验证。
PMT表所对应的字段如下表所示:
PMT表的table_id与PAT表的pid,相关联。
PAT表中的PCR_PID表示所在TS分组的PID,一般为视频ID相关联。stream_type表示当前包是音频,视频还是字幕或其他数据。如h264编码对应的是0x1b,aac编码对应的0x0f,mp3编码对应0x03。elementary_PID表示音频、视频、字幕或其它数据对应的PID,通过elementary_PID就可以找到真正的数据,用于解码。CRC32同样也是用于数据验证。
注意:这里有一段数据是循环,从字段stream_type开始到ES_info_length结束,这是一段循环,一直在解析。
如果需要加密数据,一般是在ts层的payload部分。
(2)pes 层(Packet Elemental Stream),也称为打包层,在⾳视频数据上加了时间戳等对数据帧的说明信息。也就是说时间戳pts是存储在pes header里。在做音视频同步,就需要去关联这里的时间戳信息。
pes 层是在每⼀个视频/⾳频帧上加⼊了时间戳等信息,pes 包内容很多,这⾥只留下最常⽤的。如果需要更详细研究,就需要根据spec去学习。
当解析完ts层后,这里继续解析PES层,PES层格式如下:
PES Header一般为6Bytes,Option Pes Header为3Bytes-259Bytes,不是固定值,Payload最大值不超过65526Bytes。
PES层字段表如下图所示:
pes start code表示一个pes的起始。stream id表示音频,视频id,与PMT表的id,相关联。pes packet length表示pes包长度。第一个flag表示是否是加密包,真正加密是在ts的payload部分。第二个flag表示是否包含pts,dts等。pes data length表示pes payload数据长度。这些字段中最关键的就是pts和dts值。
pts 是显示时间戳、dts 是解码时间戳,视频数据两种时间戳都需要,如果音视频的pts和dts相同,就只需要pts即可。有 pts 和 dts 两种时间戳是 B 帧引起的,I 帧 和 P 帧的 pts 等于 dts。如果⼀个视频没有B 帧,则 pts 永远和 dts 相同。
从⽂件中顺序读取视频帧,取出的帧顺序和 dts 顺序相同。dts 算法⽐较简单,初始值 增量即可,pts 计算⽐较复杂,需要在 dts 的基础上加偏移量。
注意:⾳频的 pes 中只有 pts(同 dts,这也是为什么能够常使用audio master的原因之一),而视频的 I、P 帧两种时间戳都要有,视频 B 帧只要 pts(同 dts)。打包 pts 和 dts 就需要知道视频帧类型,但是通过容器格式我们是⽆法判断帧类型的,必须解析 h.264内容才可以获取帧类型,通过帧类型去加添加pts或dts。
B帧会增加缓存,解码一般是先解出P帧,再解出B帧,所以B帧会增加延时,显示一般就是B帧先显示,因为B帧的原因,就需要调整帧顺序,需要花时间。如下图所示:
计算点播视频dts公式:
视频dts计算公式为 dts = 初始值 90000 / video_frame_rate ,初始值可以随便指定,但是最好不要取 0,video_frame_rate 就是视频帧率,⽐如 20、30。
pts 和 dts 是 以 timestamp(时间戳) 为单位的,1s = 90000 time scale ,所以一帧的pts就是90000/video_frame_rate 个 timescale。
播放时长就是⽤⼀帧的 timescale 除以采样频率,可以转换为⼀帧的播放时⻓。
计算点播音频dts公式:
音频dts计算公式为dts =初 始 值 (90000 * audio_samples_per_frame) /audio_sample_rate audio_samples_per_frame 这 个 值 与 编 解 码 相 关 ,一般 aac 取 值 1024 , mp3 取 值 1158
audio_sample_rate 是采样率,⽐如 24000、41000. AAC ⼀般解码出来是每声道 1024 个 sample,也就是说⼀帧的时⻓为 1024/sample_rate 秒。所以每⼀帧时间戳依次 0,1024/sample_rate, ...,1024*n/sample_rate 秒 。
十分注意:如果是直播场景,直播视频的 dts 和 pts 应该直接⽤直播数据流中的时间,不应该按公式计算。
(3)es 层(Elementary Stream),也称为原始流层,表示原始的音视频数据。
ts协议,三层数据结构图,如下:
ts层由ts Header(一般由4Bytes组成,第一个字节是固定0x47开头),adaption field(调整的字节,灵活改变),payload(是ts层负载,一般是184Bytes)组成。所以一般ts包是为188个字节,也有些大于188字节的。
ts层的payload主要由pes层数据组成。PES层主要由pes header(一般是6Bytes),option pes header(调整的字节,灵活改变),pes payload(不是固定值)组成。
pes层的payload主要是由es层数据组成,es层主要由视频的nal header(一般是4Bytes,一把是会有start code),nal type(一般是1Bytes),h264 data(不是固定值),音频的adts header(7Bytes),aac data(不是固定值)组成。
第一,h.264 视频
关于h264格式可以参考前面的文章,有助于你更好理解h264。
聊聊H264的 NALU
h264 NALU代码实战(1)
H264解码器原理之一
H.264详解之一
打包 h.264 数据时必须给视频数据加上⼀个 nalu(Network Abstraction Layer Unit),nalu 包括nalu header 和 nalu type,nalu header 固定为 0x00000001(帧开始)或 0x000001(帧中)。h.264 的数据是由 slice 组成的,slice 的内容包括:视频、sps、pps 等。nalu type 决定了后⾯的h.264 数据内容。其结构的spec表示如下:
F:1bit,forbidden_zero_bit,h.264 规定必须取 0。
NRI:2bits,nal_ref_idc,取值为 0~3,指示这个 nalu 的重要性,I 帧、sps、pps 通常取3,P 帧常取 2,B 帧通常取 0。
Type:5bits,取值如下表所示:
一般在工程项目中,IDR帧,SEI,SPS,PPS,这些都是常用分析的图像信息。
注意:打包 es 层数据时 pes 头和 es 数据之间要加⼊⼀个 type=9 的 nalu(分解符号),关键帧 slice 前必须要加⼊type=7 (sps)和 type=8 的 nalu(pps),⽽且是紧邻的。如下图所示:
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |