关于TS流的封装和解析
来源:互联网 发布:手机淘宝免费注册流程 编辑:程序博客网 时间:2024/05/21 11:12
一:MPEG2_TS_H264_AAC_Mux 代码分析
该代码是把H264裸流和AAC(有ADTS头)封装为TS流。
读取本地的H264裸流文件和AAC文件,封装为TS流。 还有一点bug,没有bug的版本在tsmux文件中。
主要是两个函数
int Take_Out_Pes( TsPes * tspes ,unsigned long time_pts,unsigned int frametype,unsigned int * videoframetype )
1:是把原始码流(H264和AAC)封装为PES头的码流。
int PES2TS( TsPes * ts_pes, unsigned int Video_Audio_PID , Ts_Adaptation_field * ts_adaptation_field_Head , Ts_Adaptation_field * ts_adaptation_field_Tail, unsigned long Videopts, unsigned long Adudiopts )
2:是把PES头的码流(H264和AAC)封装为TS头的TS标准流。
二:封装H264(AAC)为TS流
一般情况下,一个nal一个帧。H264的码流组成,我省略了。
1:把码流封装为pes头
H264—>读取一个个的nal,然后把一个个的nal封装为pes头的形式,不懂怎么封装为pes头的,看前面的代码就可以很清晰了。
AAC—>读取AAC音频包,去掉ADTS头,然后给音频包封装为pes头的形式。
2:pes -> ts。把pes头的码流,封装为TS标准流。
在封装成ts流的时候,还需要打入pat和pmt。怎么打入,请看代码。
这里需要注意给pts的赋值:
这里以视频帧率为25HZ,90Khz的视频频率为例:
pts==1/25*90000 = 3600 个clk。
三: TS流的格式
TS流是基于Packet的位流格式,每个包是188个字节(或204个字节,在188个字节后加上了16字节的CRC校验数据,其他格式一样)。整个TS流组成形式如下:
TS流是由一个个Packet(包)构成的,每个包都是由Packet Header(包头)和Packet Data(包数据)组成的。其中Packet Header指示了该Packet是什么属性的,并给出了该Packet Data的数据的唯一网络标识符PID。
Packet Header的说明
PID的值
Packet Header的例子:
关于PAT表
PAT表定义了当前TS流中所有的节目,其PID为0x0000,它是PSI的根节点,要查寻找节目必须从PAT表开始查找。PAT表主要包含频道号码和每一个频道对应的PMT的PID号码。
PAT表的结构体:
typedef struct TS_PAT_Program { unsigned program_number : 16; //节目号 unsigned program_map_PID : 13; // 节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个 }TS_PAT_Program typedef struct TS_PAT { unsigned table_id : 8; //固定为0x00 ,标志是该表是PAT表 unsigned section_syntax_indicator : 1; //段语法标志位,固定为1 unsigned zero : 1; //0 unsigned reserved_1 : 2; // 保留位 unsigned section_length : 12; //表示从下一个字段开始到CRC32(含)之间有用的字节数 unsigned transport_stream_id : 16; //该传输流的ID,区别于一个网络中其它多路复用的流 unsigned reserved_2 : 2;// 保留位 unsigned version_number : 5; //范围0-31,表示PAT的版本号 unsigned current_next_indicator : 1; //发送的PAT是当前有效还是下一个PAT有效 unsigned section_number : 8; //分段的号码。PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段 unsigned last_section_number : 8; //最后一个分段的号码 std::vector<TS_PAT_Program> program; unsigned reserved_3 : 3; // 保留位 unsigned network_PID : 13; //网络信息表(NIT)的PID,节目号为0时对应的PID为network_PID unsigned CRC_32 : 32; //CRC32校验码 } TS_PAT;
关于PMT表
如果一个TS流中含有多个频道,那么就会包含多个PID不同的PMT表。
PMT表中包含的数据如下:
(1) 当前频道中包含的所有Video数据的PID
(2) 当前频道中包含的所有Audio数据的PID
(3) 和当前频道关联在一起的其他数据的PID(如数字广播,数据通讯等使用的PID)
第四:打包流程图
http://blog.csdn.net/zxh821112/article/details/17587215
http://blog.csdn.net/bingqingsuimeng/article/details/9942829
http://blog.csdn.net/max_min_go/article/details/39463675
- 关于TS流的封装和解析
- 关于TS流的解析
- 关于TS流的解析
- 关于TS流的解析
- 关于TS流的解析
- 关于TS流的解析
- 关于TS流的解析
- 关于TS流的解析
- 关于TS流的解析
- 关于TS的解析
- TS流的解析
- TS流的解析
- TS流的解析
- TS流的解析
- TS流的解析
- TS流的解析
- [Multimedia][TS]TS流的解析
- 【Ts 5】Httpclient的应用和封装
- Xutils 3.0 基础用法
- getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
- 对于linux下system()函数的深度理解
- form表单重复提交问题
- Atom编辑器中文设置 ,汉化Atom插件
- 关于TS流的封装和解析
- 简单权限系统基于shiro-springmvc-spring-mybatis(学习笔记 1)
- 242. Valid Anagram QuestionEditorial Solution
- spring配置文件的一些注重点
- thinkphp的日志管理
- 设计模式~适配器模式
- 完美解决ScrollView嵌套ListView或GridView冲突
- Android SDK版本号与API级别的对应关系
- quartz定时任务中常用的cron表达式