3D蓝光影碟的SSIF文件
2013-12-11 21:25
155 查看
由于产品开发的需要,近期工作涉及到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部件才见过初步测试,以后还会遇到各种问
题,当我一一解决以后,我会继续增补这篇帖子,祝各位顺利
发现目前关于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部件才见过初步测试,以后还会遇到各种问
题,当我一一解决以后,我会继续增补这篇帖子,祝各位顺利
相关文章推荐
- unity 3d 生成apk文件时,设置图标
- libgdx 3D 从资源文件加载模型
- 3D打印机固件 Marlin 1.1.0 配置文件 说明
- 3D模型(obj文件)加载及纹理显示
- 3D中的OBJ文件格式详解
- 在Java 3D中载入外部3D模型文件
- Ycnd 3D 场景文件转换器
- ZAM 3D入门教程(6):导入AI和EPS格式的文件
- 3D中的 obj文件格式
- 对凯立德2013秋季旗舰版的再认识(含3D核心文件的下载)
- Unity 3D - 编辑器扩展之导入文件自动设置Packing Tag
- 3D引擎:Horde3D:如何解析Shader文件(一)
- 【Qt OpenGL教程】25:变形和从文件中加载3D物体
- 3 - IOS之cocos3d - 4 - 代码控制3D文件中node的material
- Altium Designer PCB导出step 3D文件时遇到的问题
- fatal error LNK1104: 无法打开文件“opencv_calib3dXXXX.lib”
- 3D中的OBJ文件格式详解
- Genesis-3D 入门教程—4.FBX文件的导入
- 3D中的OBJ文件格式详解
- DirectX-3d中.x模型转换成three.js可用的obj文件或者js文件