赞
踩
随着网络带宽、硬盘容量、屏幕分辨率等基础条件的提升,人们观影的要求也从标清、高清一路上升到4K、UHD。
蓝光影碟(BD Disc)是DVD的升级版,可以作为超高清影片的载体。
由于一些大家都懂的原因,蓝光原盘的提取文件在网络上比影碟更受欢迎,也有很多的播放器可以支持蓝光原盘文件的播放(如Kodi、vlc)。
概览
蓝光原盘文件一般保存为后缀iso的文件,或是直接以文件夹的形态存在。
iso文件可以通过命令挂载后看到其中的内容:sudo mount bd.iso /mnt
一般地,可以看到目录下有这些文件/文件夹:
蓝光文件承载了很多信息。其中除了正片以外,还有花絮、主题曲等片段,还包含了用于各个片段间、片段内进行导航的必要信息和导航程序。
大致浏览目录结构,可以看到诸如PLAYLIST(节目)、CLIPINF(片段信息)、STREAM(片段/流)、AUXDATA(附加文件,如音效、字体)等内容。
根据白皮书的说明,这些信息逻辑上按照4个层次组织:
第一层是Index table,即目录中的index.bdmv,这是一个索引表,记录了First Playback、Top Menu等的索引信息。光盘开始播放时一般就是从index.bdmv中读取信息后从Top Menu或First Playback去播放;
第二层是两种类型的Object——Movie Object和BD-J Object, 存放在MovieObject、bdjo、jar目录(未列出)。这两个Object实际上是“应用程序”,或可以理解为“导航程序”(然而,实际上BD-J Object是java程序,其功能远远不止用于导航,其最初设计都可以用来实现游戏功能)。在播放蓝光文件时,通过遥控看到的(原生)导航界面就是这些Object绘制的。
第三层是Movie Playlist。对应的是我们看到的正片、花絮、主题曲等节目。
第四层是Clip。Clip对应的是视频文件,存放在stream目录下。一个节目可以是与一个视频文件对应,也可以包含多个视频文件。同样,一个视频文件可以用于一个节目,也可以用于多个节目(比如你看到的精彩片段很可能就是“抠”正片的视频某个片段播放的)。
总体来看,蓝光文件从一个索引表出发,结合各类信息文件,如playlist、clpi、move object等,将里面的视频片段组织起来,并能通过导航程序方便地浏览、播放。
工具
目前,市面上主流的开源软件多采用libbluray作为其引擎读取蓝光文件的信息和视频流。
libbluray还提供了很多工具可以解析上文提到的文件。如index_dump, mpls_dump等。
下面我们的分析也将基于该项目提供的工具进行说明。
index.bdmv
简单起见,这里分析的是只有一个节目(只有正片)的蓝光文件(蓝光文件挂在在/mnt/上):
./index_dump /mnt
First playback:
object type : HDMV
playback type : Interactive
id_ref : 2
Top menu:
object type : HDMV
playback type : Interactive
id_ref : 1
Titles: 1
01
object type : HDMV
playback type : Movie
id_ref : 0
access type : Accessible
可以分别查到First playback和Top menu对应的都是Movie Object,id分别是2和1.
另外还有一个Title(也就是Playlist,libbluray里的术语与白皮书有些出入),对应id为0的Movie Object
Movie Object
./mobj_dump /mnt/BDMV/MovieObject.bdmv
Number of objects: 3
Object 0:
number of commands: 5
resume intention flag: 1
menu call mask: 0
title search mask: 0
Object 1:
number of commands: 9
resume intention flag: 1
menu call mask: 0
title search mask: 0
Object 2:
number of commands: 5
resume intention flag: 1
menu call mask: 0
title search mask: 0
从MovieObject里也可以看到,有3个Object,还可以看到command数。
不妨"反汇编"一个MovieObject看下:
./mobj_dump -d /mnt/BDMV/MovieObject.bdmv
Number of objects: 3
Object 0:
number of commands: 5
resume intention flag: 1
menu call mask: 0
title search mask: 0
program:
0000: 90000001 0000000a,00000000 move r10 , r0
0001: 90400001 00000000,00000000 move r0 , 0
0002: 90400001 00000000,00000000 move r0 , 0
0003: 12820000 00000000,0000000a PLAY_PL_MK 0 , r10
0004: 09810000 00000001,00000000 JUMP_TITLE 1
会发现这是类似汇编语言的代码,甚至可以从字面上猜测出其含义。Object 0从上面index的分析可以知道是正片,代码含义是正片播放结束后跳回到title 1,也就是Top Menu。所以正片播放结束会跳回到主菜单上。
playlist
playlist存放在PLAYLIST文件夹下,以5位10进制数命名,以mpls作为后缀。
通过mpls_dump可以看到PLAYLIST的信息。
./mpls_dump -ic /mnt/BDMV/PLAYLIST/00000.mpls
00000.mpls -- Duration: minutes 107:02
Clip Id 00000
Stc Id: 00
Connection Condition: Non-seamless (01)
In-Time: 27000000
Out-Time: 316018080
Video Stream 0:
Codec (001b): H.264
PID: 1011
Format 06: 1080p
Rate 03: 25
Audio Stream 0:
Codec (0081): AC-3
PID: 1100
Format 03: Stereo
Rate 01: 48 Khz
Language: und
PlayMark Count 22
PlayMark 0
Type: 01
PlayItem: 00000
Time (ticks): 27000000
Duration (mm:ss.ms, ticks): 0:0.00, 0
PlayMark 1
Type: 01
PlayItem: 00000
Time (ticks): 40500000
Duration (mm:ss.ms, ticks): 0:0.00, 0
……
-i是列出对应的clip,-c是列出其中的PlayMark(PlayItem)。
可以看到这个PLAYLIST刚好对应的是一个CLIP,这个CLIP的名字是00000。有22个PlayMark(22个跳转点,22个PlayItem),PlayMark就是一个跳转点,通过这个跳转点可以快速定位到影片制作者预设的时间点(一般按照剧情发展来设定这个时间点)。
clip
每个clip就是STREAM目录下的一个m2ts(一种ts扩展)文件,每个m2ts在CLIPINF目录下有一个与其名字相同,但以clpi为后缀的信息文件,标记了它的访问点(Access Point),主要用于seek(ts这种封装本身是seek的访问点的)
./clpi_dump -vi /mnt/BDMV/CLIPINF/00000.clpi
……
Fine: 12348
Angle Change Point: False
I End Offset: 2
PTS EP: 1257
SPN EP: 120539
PTS - SPN Map
Coarse: 0
PTS 53999616/26999808 -- SPN 4
Coarse: 1
PTS 54046720/27023360 -- SPN 608
PTS 54093312/27046656 -- SPN 3340
PTS 54139904/27069952 -- SPN 7457
……
ffprobe /mnt/BDMV/STREAM/00000.m2ts
Input #0, mpegts, from '/mnt/BDMV/STREAM/00000.m2ts':
Duration: 01:47:02.66, start: 600.000000, bitrate: 21658 kb/s
Program 1
Stream #0:0[0x1011](und): Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x1100](und): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 192 kb/s
bdj object
bdj obejct存放在BDJO目录下,以bdjo为后缀。可以用bdjo_dump解析。
./bdjo_dump BDMV/BDJO/00001.bdjo #这里分析的是另一部影片
Terminal Info:
Default AWT font : *****
initial HaVi config : 7
Menu call mask : 1
Title search mask : 1
……
Application 1:
Control code: : 1 (autostart)
Type : 1 (BD-J App)
Organization ID : 7FFF646C
Application ID : 4000
Priority : 1
Binding : 3 (title bound)
Visibility : 1 (applications)
Profiles:
Profile 6 Version 1.0.0
Names:
eng: TitleBoundXlet
Base directory : 01001
Icon locator :
Icon flags : 0x0000
Classpath extension : /77001
Initial class : com.foxbd.dds.TitleBoundXlet
Parameters : 4001
……
Terminal Info记录了这个object要使用的一些“终端”信息,比如字体配置。一个bdjo可以包含多个Application。比如这里列举的Application 1,入口类(Initial class)是com.foxbd.dds.TitleBoundXlet, 该类在JAR/01001.jar中(Base directory)
至此,对于蓝光文件的目录结构,及其主要文件就分析完了。但对于每个字段的含义并未深入分析,而且在libbluray代码中的接口用词、术语与白皮书又有所不同,因此,在使用libbluray库的时候需要从其含义上建立与白皮书名词的对应关系。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。