本文主要是介绍TS码流解析-4-解析PMT表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
任务四
根据解析PAT表的PMT_PID列表,获取所有的相关的PMT表,并且解析出包含的节目信息,主要是指音频和视频的pid。
相关知识
相信解码流解到这一步的人,对表的解析多多少少有一些了解,在这先放张PMT表的结构图,方便大家了解。PMT表示的是节目映射表的简称,可由PAT表查找到相应的PID,里面存储着音频、视频以及其他一些与节目相关的信息。解到这一步后,可以尝试着把音频视频的PID对应的ts_package找出来,并且另存一个文件,用播放器打开,可以看到对应的节目,会对解码流的任务有更深的理解,知道我们的目的是什么。
前八个字节就不用赘述了,descriptor对目前阶段来说,用处不大,也用不着管,知道它占多大空间就行了,我们要关注的字段有
program_info_length->后面描述子的总长度,stream_type前面的那个描述子
stream_type->媒体流的类型,判断是音频还是视频的重要标志
elementary_PID->媒体流类型对应的PID,可通过此PID找到对应的信息
ES_info_length->后续descriptor的长度
解析过程
这里的解析过程会比较麻烦,因为pmt的table有很多个,每解一个节目需要获取一遍table
1 流程图
2 数据结构定义
typedef struct stream_message
{unsigned int stream_type :8;unsigned int elementary_pid :13;struct stream_message *next;
}STREAM_MESSAGE;typedef struct pmt_info
{unsigned short program_number;STREAM_MESSAGE *stream_message; struct pmt_info *next;
}PMT_INFO;typedef int(*CHECK_TYPE)(STREAM_MESSAGE message_node);
3 解析代码
/*****************************************************************************
* Function Name: check_stream_type_callback
* Description : according the condition then get the specify message
* Parameters : STREAM_MESSAGE message_node
* Returns : static int
* -1 check error
* other check success
*****************************************************************************/
static int check_stream_type_callback(STREAM_MESSAGE message_node)
{if (0x0b == message_node.stream_type){return 3;}if (0x06 == message_node.stream_type){return 2;}if ((
这篇关于TS码流解析-4-解析PMT表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!