3D蓝光影碟的SSIF文件

来源:互联网 发布:安妮舞会公主皮肤淘宝 编辑:程序博客网 时间:2024/05/02 01:48

由于产品开发的需要,近期工作涉及到3D蓝光影碟中的SSIF文件解析;
发现目前关于SSIF的资料真是太少了,可供程序员参考的资料则更少;
分析了一下,资料这么少的原因有2个:
 第一点,蓝光组织没有免费开放SDK;(获取SDK需加入组织,需要交纳权利金,需要保证不为盗版留漏洞)
 第二点,目前盗版3D蓝光影碟不太多;(有需求才有开发,即使开源软件开发者也优先开发需求量大的软件)

不过,我经过近期的努力,已经基本掌握的SSIF文件的解析方法,并且编写了DirectShow下的Parser过滤器;
以下内容比较粗疏,仅供各位同行参考:

1.访问单元:SSIF文件是192字节规格的MPEG2-TS文件,每32个TS包组成一个[访问单元],所以,一个

    访问单元是192*32=6144字节,对SSIF文件的应该以6144字节的整倍数读取;


2.传输流解析:对于SSIF的每个192字节的TS包,忽略前面的4个字节,后面的188字节按照标准TS解析

    方法,和其他TS流一样,它也包含PAT和PMT以及PES流;不过对于SSIF文件,只有一个[节目],也就

    是说,只有一个PMT流,但是对于PMT的内容要注意,如果遇到第一个完整的PMT的section就认为OK,

    那么就会无法识别MVC的PES流(有些SSIF的PMT的第一个Section不包括MVC流),所以,要继续读

    取后续的PMT数据,直到遇到PMT声明MVC流信息为止;(具体原因是:SSIF文件是由M2TS文件和扩

    展数据交错组成的,PMT的第一个Section很可能是M2TS的数据,必须多探测一些PMT数据,直到遇到

    SSIF的扩展部分的PMT数据为止);


3.新版本文档:旧版本的ISO13818-1和旧版本的H.264文档,并没有MVC流部分;所以,你必须找到最新

    版本的文档,我找到的新版本的标准文档是英文版,相比旧版本的标准文档,只是扩充了一些新东西,

    阅读不算吃力;(这些标准文档在ISO/ITU可以找到)


4.参考的代码:如果只是阅读标准文档来写代码,那会很吃力,建议一边阅读FFMPEG的代码,一边阅读

    标准文档,这样会更好的理解标准文档,也会有一个参照代码,便于设计自己的代码架构;


5.视频流信息:我需要开发一个用于DirectShow的源过滤器,所以,需要从SSIF文件的AVC流和MVC流里

    面提取视频规格信息,总的来说,无论是AVC还是MVC,都是H.264格式的数据,只是MVC流不包含关键

    帧,MVC流是依赖AVC流来解码的(MVC在解码时需要参考AVC流,所以可以看作MVC只有P帧和B帧);

    提取视频规格消息的具体步骤是:首先对一个H.264的PES帧进行NALU分解,如果这个PES帧包括SPS

    或PPS类型的NALU,那么就开始分析SPS的NALU数据,并且保持SPS的NALU数据和PPS的NALU数据,

    当然,分析SPS数据之前,还要做脱壳处理(就是针对0x03码做脱壳),然后,以BE位序 读取SPS数据,

    必须注意SPS的一些字段是以[哥伦布码]方式存储的,所以,还要考虑解码[哥伦布码],具体的脱壳和哥伦

    布码算法,在H.264文档里面有非常明了的说明;我们可以从SPS里面得到[规格][级别][宽度][高度]。。这

    类信息,这也是AM_MediaType里面必须的;


6.音频流信息:SSIF文件可以包含AC3/EAC3/DTS/DTS-HD/Ture-HD/LPCM这些音频流,我们必须对这些类

    别的音频流一一进行规格解析,不建议完全照抄FFMPEG的解析方法,太山寨了,应该阅读这些音频流的

    标准文档,然后规规矩矩的写出解析代码,免得遇到稍微特别的音轨就导致故障;必须提醒一下,这些音

    频流的解析大多需要按位读取,而不是按字节读取;(DTS和AC3还存在扩展子流,挺有趣)


7.字幕流信息:一般来说,SSIF包含的大多是PGS格式的字幕流,说白了,就是YUV色系的RLE压缩的位图,

    DirectShow的AM_MediaType只需要语言码,我们不需要解析PGS数据;(如果关注PGS解码方法,可以

    参考FFMPEG的代码,虽然算法山寨了一些,但是能用);


8.视频的帧率:我所测试的几个SSIF文件,其中的SPS的VUI都没有帧间隔时间,就是说,没有现成的帧率参

    数可供读取,那么,我只好先连续读取6个AVC的PES帧,然后用各帧的DTS差值推算,还挺准的;(注意

    不要用PTS值来推算,因为PTS值可能 先大后小)


9.跳转的方法:既然是DirectShow的SourceFilter,那就应该实现IMadiaSeeking接口,实现的方法也不太难,

    加载SSIF文件的时候,先扫描文件前6M字节,再扫描文件的尾6M字节,记录AVC流的最大PTS和最小PTS

    数值,当需要Seeking的时候,用比例推算法 从时间推算文件位置,然后读取一点数据,看看PTS是多少,

    如果比目标时间大,那么就以推测位置作为max 以文件开头作为min,再次比例推算;如果比目标时间小,

    就以推测位置作为min 以文件结尾作为max,再次比例推算;只要迭代3次,误差就会小于两秒,最后,再

    来一次顺序扫描,找到目标时间之前的最接近目标时间的文件位置,然后开始寻找同步点(AVC的IDR);


a.卡碟的预防:如果SSIF文件位于硬盘,那么你可以放心读取;不过,对于光碟,必须要防止光碟划伤造成的

    读取卡死现象,预防的方法是采用OverLapped读取方式,可以规定读取超时;


嗯。。。我所遇到的难点和要点就这么多,目前,我的ParserSSIF部件才见过初步测试,以后还会遇到各种问

    题,当我一一解决以后,我会继续增补这篇帖子,祝各位顺利


0 0