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

java蓝光_蓝光文件解析相关推荐

  1. .so是什么文件_安卓 so 文件解析详解

    so 文件是啥?so 文件是 elf 文件,elf 文件后缀名是.so,所以也被称之为so 文件, elf 文件是 linux 底下二进制文件,可以理解为 windows 下的PE文件,在 Andro ...

  2. java 队列复制_复制一个文件夹里的文件到另一个目录下 (使用队列的方法实现)...

    最近在由于准备实习,在学android,也会用到Java,所以想实现复制文件夹的功能,当然也参考了别人的代码.这里是我参考的网址:http://blog.csdn.net/etzmico/articl ...

  3. Java中如何使用JSON进行文件解析

    目录 一.什么是JSON 二.JSON的用途 三.如何应用JSON 一.什么是JSON JSON是一种轻量级的数据交换格式.它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储 ...

  4. oxooooooof4蓝屏_蓝屏代码0x000000f4怎么解决?

    0X000000F4[大家是否在使用电脑过程中遇到突然蓝屏0X00000F4在情况呢,这个如果是看电影也就算了,重启下就当看了广告了呗,如果是游戏或者文件编辑到一半的情况是不是又砸电脑的冲动呢,小编平 ...

  5. java的博_小博老师解析Java核心技术 ——I/O流

    [引言] 我们在学习Java编程的时候,经常会遇到文件数据的各类操作,这类操作一般都会借助于JDK中的I/O流对象.我们知道JDK中I/O流的实现类有很多种类型,那么在实际操作中我们该如何取舍呢?今天 ...

  6. java ftl 标签_在FTL文件中使用自定义的Java方法

    在项目中使用FreeMarker做为Spring MVC中的视图文件,在展示List的时候,展示的对象中带有时间字段,但是此时间字段存的是整型的毫秒值,为了更好的展示给用户,必须要进行格式化. 但是F ...

  7. java csv 数组_使用csv文件的输入填充结构数组

    我必须阅读这种csv文件 565;4;6;8;11/10/2017;11:30 756;5;9;1;12/12/2017;10:40 765;-8;-2;-1;06/01/2018;23:23 我需要 ...

  8. java参数化查询_小博老师解析Java核心技术 ——JDBC参数化查询(二)

    [步骤阅读四]SQL注入 按照以上方式开发,确实已经完成了基本的用户登录业务需求,但是这么做的话可以会出现一个比较严重的问题,那就是容易被SQL注入.所谓SQL注入,就是在需要用户填写信息,并且这些信 ...

  9. java 生成.pcap_java抓包后对pcap文件解析示例

    这是自己写的简单的解析pcap文件,方便读取pcap文件,大家参考使用吧 复制代码 代码如下: InputStream is = DataParser.class.getClassLoader().g ...

最新文章

  1. C++ memset
  2. 对tableView三种计算动态行高方法的分析
  3. 设计模式的理解:组合模式 (Composite)
  4. 计算机信息加工的类型及举例,3.1.2计算机信息加工的过程和类型
  5. 编程 跳台阶_Java版剑指offer编程题第8题--跳台阶
  6. 权限表使用联合主键吗_天天写 order by,你知道Mysql底层执行流程吗?
  7. 漫步数理统计五——条件概率与独立(上)
  8. c语言调用Windows自定义消息,VC自定义消息postmessage用法(消息响应函数)
  9. 【图论】最小生成树学习笔记
  10. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(1月16日-2月5日)
  11. 传世经典书丛-UNIX编程艺术
  12. cd oracle home/dbs,Oracle专家高级编程学习笔记
  13. SPSS Modeler 入门(一)
  14. Linux下如何进入Redis客户端
  15. JavaScript最详细基础语法总结(跳坑记录!)
  16. jar包太大?手把手教你分析 Maven 依赖,完成瘦身优化!
  17. HDU 3903 Trigonometric Function (三角恒等式余弦定理)
  18. 学生证选课系统c语言大作业,学生选课管理系统c语言程序
  19. 安装黑群晖找不到局域网电脑_UNRAID 、黑群晖、 穿越派 私有云部署测试
  20. 「万物生长」一个APK从诞生到活跃在Android手机上,android驱动开发权威指南pdf

热门文章

  1. Chrome 十周年亮出大招:彻底干掉URL!
  2. 俄罗斯套娃素数c语言解法,求俄罗斯套娃素数(BFS)
  3. 浪潮服务器开启远程管理,浪潮服务器远程管理汇编.docx
  4. matlabpython绘图:一枝花
  5. ALSA 音频开发部分基础知识
  6. unity验证手机号和邮箱是否合法
  7. 中国迟来的电信业重组
  8. (16)UVM sequence和item
  9. 使用Hooks的注意事项
  10. c语言在电子信息工程技术中的应用,计算机网络对电子信息工程技术的应用论文...