发明内容
(一)要解决的技术问题
为了解决解复用器的应用对象单一的问题,本发明提供一种多模mpeg系统层解复用方法,以有效的自适应的完成mpeg1系统层、mpeg2系统层PS流以及mpeg2系统层TS流的解复用,并通过共用相同模块,减少指令空间;本发明在解复用时,还能通过帧扫描模块,只存储非零且与前一值不同的PTS/DTS,节省存储空间。
(二)技术方案
为了达到上述目的,本发明采用的技术方案如下:
一种多模mpeg系统层解复用方法,该方法包括:
a、判断数据流的格式,如果数据流是mpeg1/2系统层PS流,则执行步骤b;如果数据流是mpeg2系统层TS流,则执行步骤d;
b、判断该mpeg1/2系统层PS流是mpeg1标准的PS包还是mpeg2标准的PS包,并对PS流的包头进行解析,然后判断PS流是否有系统首部,如果有系统首部则对该系统首部进行解析,如果没有系统首部,则将得到的PES数据送入PES解析单元;
c、检测到PES包数据之后,对PES包头进行解析,将得到的音视频ES数据送入存储和帧扫描模块;
d、在帧扫描模块中,如果有视频帧或音频帧,则帧数加1,若此时的音视频PTS/DTS不为零且与前一PTS/DTS不等,则记录当前的帧数和对应的PTS/DTS,并将音视频ES数据送入MEMORY,结束;
e、对mpeg2系统层TS流的起始码进行同步,对达到同步后的TS包进行解析,分析TS包的PSI信息中的PAT和PMT表,提取相应节目的音视频TS包负载;
f、对提取的音视频TS包负载进行PES头扫描,如果有PES头,则调用PES_mpeg2进行解析,如果没有PES头,则将数据直接送入存储和帧扫描模块。
上述方案中,步骤a中所述判断数据流的格式是通过分析数据流的起始码实现的。
上述方案中,步骤b中所述判断该mpeg1/2系统层PS流是mpeg1标准的PS包还是mpeg2标准的PS包是通过分析数据流在起始码后的4bit数据实现的,具体包括:如果起始码之后的2bit数据为0b01,则为mpeg2标准的PS包,如果起始码之后的4bit数据为0b0010,则为mpeg1标准的PS包。
上述方案中,步骤e中所述分析TS包的PSI信息中的PAT和PMT表,提取相应节目的音视频TS包负载的步骤,具体包括:搜索TS流中的PAT表,解析后得到PMT表的PID值;然后根据该值找到相应的PMT表,解析后得到各节目的音视频PID以及PCR的PID值;选择某一节目,确定需要的音视频以及PCR的PID值;看是否需要的PCR的PID,如果是,则在其传送流调整字段中提取PCR值保存;之后,再根据音视频PID值,提取相应的TS包负载。
上述方案中,步骤f所述扫描PES包头的步骤,具体包括:对音视频TS包负载进行扫描,如果有PES包头,则对PES包头进行解析,如果该TS包剩余数据不够PES包头长度,则将PES包起始码后的数据缓存起来,加载在下一相同PID的TS包负载前,再进行PES包头解析。
上述方案中,步骤b中所述对PS流的包头进行解析能够得到SCR,步骤e中所述对TS包进行解析能够得到PCR,该SCR和该PCR具有有相同的结构,能够通过同一SCR/PCR存储模块保存数据。
上述方案中,步骤d中所述帧扫描模块,当扫描到视频帧头时,视频帧序号加1,检测视频PES包头解析时记录的PTS/DTS,若此数据不为零,且与前一PTS/DTS不同,则存储此时的视频帧序号和对应的PTS/DTS;当扫描到音频帧头时,音频帧序号加1,检测音频PES包头解析时记录的PTS,若此数据不为零,且与前一PTS不同,则存储此时的音频帧序号和对应的PTS;后续的音视频解码能够根据帧序号和PTS/DTS插值出其余的PTS/DTS。
上述方案中,步骤d中所述存入MEMORY的音视频ES数据以及提取的PTS/DTS,用于供后续的音视频解码和同步。
(三)有益效果
从上述技术方案可以看出,本发明具有以下有益效果:
1、通过对码流的分析,能够自适应的完成mpeg1系统层,mpeg2系统层PS流以及TS流的解复用,得到音视频ES数据以及时钟信息;
2、通过复用系统首部解析模块,PES包头解析模块,PCR/SCR存储模块,数据存储和帧扫描模块,在完成解复用功能的同时,能有效节约指令存储空间;
3、通过帧扫描模块,只存储帧数以及非零且不重复的PTS/DTS,有效的节约了存储空间。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。
如图1所示,为mpeg2标准中的简化的总体框图,mpeg2系统层PS流和TS流都是由音视频数据经过音视频编码器得到音视频ES包,再通过分组器,得到音视频PES包,然后再通过不同的复用模式得到的,而mpeg1的系统层与mpeg2系统层PS流具有相似的流程。
如图2所示,为mpeg系统层解复用和解码的一般模式,先通过不同模式的解复用,将系统流分解得到音视频PES包,然后再分解得到音视频ES包,将其送入音视频解码器后得到最后的音视频数据。
如图3所示,图3是本发明提供的多模mpeg系统层解复用的方法流程图,该方法具体包括以下步骤:
a、判断数据流的格式,如果数据流是mpeg1/2系统层PS流,则执行步骤b;如果数据流是mpeg2系统层TS流,则执行步骤d;
在本步骤中判断数据流的格式是通过分析数据流的起始码实现的。
b、判断该mpeg1/2系统层PS流是mpeg1标准的PS包还是mpeg2标准的PS包,并对PS流的包头进行解析,然后判断PS流是否有系统首部,如果有系统首部则对该系统首部进行解析,如果没有系统首部,则将得到的PES数据送入PES解析单元;
c、检测到PES包数据之后,对PES包头进行解析,将得到的音视频ES数据送入存储和帧扫描模块;
d、在帧扫描模块中,如果有视频帧或音频帧,则帧数加1,若此时的音视频PTS/DTS不为零且与前一PTS/DTS不等,则记录当前的帧数和对应的PTS/DTS,并将音视频ES数据送入MEMORY,结束;
e、对mpeg2系统层TS流的起始码进行同步,对达到同步后的TS包进行解析,分析TS包的PSI信息中的PAT和PMT表,提取相应节目的音视频TS包负载;
f、对提取的音视频TS包负载进行PES头扫描,如果有PES头,则调用PES_mpeg2进行解析,如果没有PES头,则将数据直接送入存储和帧扫描模块。
上述步骤b中所述判断该mpeg1/2系统层PS流是mpeg1标准的PS包还是mpeg2标准的PS包是通过分析数据流在起始码后的4bit数据实现的,具体包括:如果起始码之后的2bit数据为0b01,则为mpeg2标准的PS包,如果起始码之后的4bit数据为0b0010,则为mpeg1标准的PS包。
上述步骤e中所述对mpeg2系统层TS流的起始码进行同步,对达到同步后的TS包进行解析的步骤中,当连续5个包的起始码都为0x47时,认为达到同步,进入TS包解析;如果同步之后,出现连续三个包的起始码不为0x47,则认为失去同步,跳出TS包解析。
上述步骤e中所述分析TS包的PSI信息中的PAT和PMT表,提取相应节目的音视频TS包负载的步骤,具体包括:搜索TS流中的PAT表,解析后得到PMT表的PID值;然后根据该值找到相应的PMT表,解析后得到各节目的音视频PID以及PCR的PID值;选择某一节目,确定需要的音视频以及PCR的PID值;看是否需要的PCR的PID,如果是,则在其传送流调整字段中提取PCR值保存;之后,再根据音视频PID值,提取相应的TS包负载。提取音视频TS包负载的步骤之后进一步包括:对音视频TS包负载进行扫描,如果有PES包头,则对PES包头进行解析,如果该TS包剩余数据不够PES包头长度,则将PES包起始码后的数据缓存起来,加载在下一相同PID的TS包负载前,再进行PES包头解析。
上述步骤b中所述对PS流的包头进行解析能够得到SCR,步骤e中所述对TS包进行解析能够得到PCR,该SCR和该PCR具有有相同的结构,能够通过同一SCR/PCR存储模块保存数据。
上述步骤d中所述帧扫描模块,当扫描到视频帧头时,视频帧序号加1,检测视频PES包头解析时记录的PTS/DTS,若此数据不为零,且与前一PTS/DTS不同,则存储此时的视频帧序号和对应的PTS/DTS;当扫描到音频帧头时,音频帧序号加1,检测音频PES包头解析时记录的PTS,若此数据不为零,且与前一PTS不同,则存储此时的音频帧序号和对应的PTS;后续的音视频解码能够根据帧序号和PTS/DTS插值出其余的PTS/DTS。
上述步骤d中所述存入MEMORY的音视频ES数据以及提取的PTS/DTS,用于供后续的音视频解码和同步。
如图4所示,图4是依照本发明实施例的多模mpeg系统层解复用的方法流程图,该方法包括以下步骤:
步骤1、判断起始码,是mpeg1/2系统层PS流还是mpeg2系统层TS流;如果是mpeg1/2系统层PS流,如果起始码之后的2bit数据为0b01,则为mpeg2标准的PS包,如果起始码之后的4bit数据为0b0010,这是mpeg1标准的PS包,然后根据相应标准对PS包头进行解析;
步骤2、解析PS包之后,如果有系统首部则对其进行解析,如果没有,则对相应的PES包进行解析,将得到的ES数据送入存储和帧扫描模块;
步骤3、解析PES包之后,在帧扫描模块中,如果有视频帧或音频帧,则帧数加1,若此时的音视频PTS/DTS不为零且与前一PTS/DTS不等,则记录当前的帧数和对应的PTS/DTS,并将音视频ES数据送入MEMORY;
步骤4、如果是mpeg2系统层TS流,则对其起始码进行同步,当连续5个包的起始码都为0x47时,认为达到同步,进入TS包解析,如果同步之后,出现连续三个包的起始码不为0x47,则认为失去同步,跳出TS包解析;
步骤5、对达到同步后的TS包进行解析,分析其PSI信息中的PAT和PMT表,提取相应节目的音视频TS包负载;
步骤6、对提取的音视频TS包负载进行PES头扫描,如果有PES头,则调用PES_mpeg2进行解析,如果该TS包剩余数据不够PES包头长度,则将PES包起始码后的数据缓存起来,加载在下一相同类型的TS包负载前,再行PES包头解析,之后数据送入存储和帧扫描模块
步骤7、完成了对PES包头解析后的数据,在帧扫描模块中提取相应的帧数和PTS/DTS信息,并将音视频ES数据存入MEMORY。
如图5所示,图5是mpeg2系统层TS流PSI表解析原理图及对音视频包选择的示意图。mpeg2系统层TS流PSI表解析及音视频包的选择,首先搜索TS流中的PAT表,解析后得到PMT表的PID值;然后根据该值找到相应的PMT表,解析后得到各节目的音视频PID以及PCR的PID值;选择某一节目,确定需要的音视频以及PCR的PID值;看是否需要的PCR的PID,如果是,则在其传送流调整字段中提取PCR值保存;之后,再根据音视频PID值,提取相应的TS包负载,送入图4的步骤6。
图6是本发明中提取的音视频帧数与对应时间戳的结构示意图。在存储和帧扫描模块中,提取的视频帧数和对应PTS/DTS,音频帧数和对应的PTS在MEMORY中的存储结构,可供后续的音视频解码进行同步。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。