java蓝光_蓝光文件解析

随着网络带宽、硬盘容量、屏幕分辨率等基础条件的提升,人们观影的要求也从标清、高清一路上升到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库的时候需要从其含义上建立与白皮书名词的对应关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值