在解析PMT表时遇到一些疑惑,在这里做个总结。
解析完PAT后得知PMT_PID就可以开始解析PMT了,但是我仔细一看PMT的表的格式,发现我几点疑惑,前面一些参数和PAT一致,但是后面有3个for循环,突然就懵了。
PAT就一个for循环唉,可以通过section_length得知接下来的长度减掉for循环前到section_length的那部分长度再减去CRC_32的长度就可以得知for循环所占的大小了。
想了好久才想清楚,section_length含义还是一样的, program_info_length 是该节目的信息长度,此字段之后可能会有一些字节描述该节目的信息,这个参数就是表示第一个for循环的大小了,这样我们通过加减就可得出第二个for循环的大小,ES_info_length 是该节目相关原始流的描述符的信息长度,通过这个我们可得知第三个for循环的大小了。
在解析小循环里的数据时,我刚开始犯了一个错误,我看的是CA_descriptor这个表,错误的认为descriptor_length这个参数表示的是小小循环里的private_data_byte的长度,事实上它表示的是接下来的数据长度。CA_PID表示的是ECM_PID。当descriptor_tag = 0x9时描述的就是CA_descriptor这个表。
还有就是PAT中的节目顺序和PMT中的节目顺序并不一定是一样的,可能是打乱的,我被我的打印结果困扰了好久