属于是没啥干的,正好前段时间刷到了编剧雷神的一条视频,关于电影放映格式的科普,引起了我的兴趣,这里记录一下研究以及分析,观测一下这个格式的细节以及利用点,进行一个题目的出,欢迎其他师傅进行出题,拓展题目的知识面
介绍
直接丢一个百度百科的截图和连接,这里比较详细,后面也不进行重复内容的赘述,这里可以看看他的主要应用场景以及原理的一个情况DCP(数字电影包)_百度百科 (baidu.com)
DCP毕竟是影院放映格式,电影作为商业的产物,自然大部分的软件是需要收费的,这里百科提到了一个叫DCP-o-matic的免费软件,这是好的,而且自带中文,安装速度也非常快,这里是他的一个网址,可以进行一个下载
并且可以看见,支持的平台还是非常多的,作者还是很牛逼的
二(不知道起什么标题
软件安装完成后,桌面会直接出现五个图标,还是比较哈人
一个一个来,直接最后一个
完整启动
整个界面看起来还是比较牛逼的,初次上手是完全不明白需要干些什么。。。
当然,按照常规软件使用,第一步自然是创建全新的工程
这样,左边就出现了经典视频编辑软件的预览框了属于是
随便导入个视频然后导出即可,当然,具有非常多的设置内容需要我们进行设置与调试,自行摸索,里面涉及电影方面的知识,不在我的知识范畴。
核心处是这里的,它具有签名以及加密的选项,
在创建中也存在KDM
当然不知道什么是KDM的可以看看这个文章
(15条消息) 数字电影的KDM是什么?_feinanghun3788的博客-CSDN博客_kdm是什么意思
这里我直接生成一个未加密的DCP导出来看看情况
框中选中的最长文件名就是导出后的DCP文件包,通过拷贝到影院的管理系统就可以进行正确的放映
video则为缓存文件,导出后删除即可,节约硬盘文件
如果需要本地播放dcp文件包,利用自带的player播放即可
(虚拟机效率有点低,演示到这里,毕竟2k码率不是虚拟机带的动的.jpg
那么接下来就是主观的文件分析与解析,纯原创,无任何参考
解析
观察一下文件列表
逐一观看分析
首先是ASSETMAP文件
记录着所有当前DCP包的所有uuid,文件名称以及文件的大小,作用是读取软件读取ASSETMAP对待播放的文件以及读取的文件进行解析,
uuid貌似是随机,没啥规律。但是我这边测试如果uuid被更改的话软件是无法正常播放的。
主要结构
<Asset>
<Id>urn:uuid:a30d02bb-4bd2-4123-a64a-59fad470df67</Id>
<PackingList>true</PackingList>
<ChunkList>
<Chunk>
<Path>pkl_a30d02bb-4bd2-4123-a64a-59fad470df67.xml</Path>
<VolumeIndex>1</VolumeIndex>
<Offset>0</Offset>
<Length>8740</Length>
</Chunk>
</ChunkList>
</Asset>
还是比较显而易见的xml格式
下个文件,cpl文件的一个分析
内容还是比较多的,
当然常规格式是不变的,该文件主要解析判别音频和视频详细信息和签名加密的
<ReelList>
<Reel>
<Id>urn:uuid:d5baf17c-83d9-4306-9684-3428a8591708</Id>
<AssetList>
<MainPicture>
<Id>urn:uuid:76c03e9e-89fa-476f-82c1-3830c08ec5a7</Id>
<AnnotationText>j2c_76c03e9e-89fa-476f-82c1-3830c08ec5a7.mxf</AnnotationText>
<EditRate>30 1</EditRate>
<IntrinsicDuration>4095</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>4095</Duration>
<Hash>5aGsAqrh48aUfuPSKtVMoAOaOoY=</Hash>
<FrameRate>30 1</FrameRate>
<ScreenAspectRatio>1.85</ScreenAspectRatio>
</MainPicture>
<MainSound>
<Id>urn:uuid:9b04a14b-2bfd-42d0-9788-bfd3e5d54ad6</Id>
<AnnotationText>pcm_9b04a14b-2bfd-42d0-9788-bfd3e5d54ad6.mxf</AnnotationText>
<EditRate>30 1</EditRate>
<IntrinsicDuration>4095</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>4095</Duration>
<Hash>7EH1FaDkSggILH7pC+isiipNODI=</Hash>
</MainSound>
</AssetList>
</Reel>
</ReelList>
uuid其实对应的就是文件名,核心的内容则是Hash值,其余并不重要,当然,在DCP包中,视频会被统一认为成是图片序列,这也是为什么视频文件会被认为成MainPicture。MainSound不必多说,音频的参数以及Hash值写着呢。
下段开始则是具体的密钥,本质上是openssl的x509加密方式,同理,经过测试,如果密钥不正确,无法被解析播放。
这里本质上的作用是签名作用,如果是在最开始导出的时候勾选加密的话,会有一定的密钥对应进行解密,后面进行展示。
接下来是PKL文件
同样分成两段来进行解析
<AssetList>
<Asset>
<Id>urn:uuid:b930717c-2ebd-41ee-bf96-4f7eb552912b</Id>
<AnnotationText>b930717c-2ebd-41ee-bf96-4f7eb552912b</AnnotationText>
<Hash>NbJAmgRI82AB5Bhyzo/FpBmd0w4=</Hash>
<Size>9233</Size>
<Type>text/xml;asdcpKind=CPL</Type>
</Asset>
<Asset>
<Id>urn:uuid:76c03e9e-89fa-476f-82c1-3830c08ec5a7</Id>
<AnnotationText>76c03e9e-89fa-476f-82c1-3830c08ec5a7</AnnotationText>
<Hash>5aGsAqrh48aUfuPSKtVMoAOaOoY=</Hash>
<Size>2518301586</Size>
<Type>application/x-smpte-mxf;asdcpKind=Picture</Type>
</Asset>
<Asset>
<Id>urn:uuid:9b04a14b-2bfd-42d0-9788-bfd3e5d54ad6</Id>
<AnnotationText>9b04a14b-2bfd-42d0-9788-bfd3e5d54ad6</AnnotationText>
<Hash>7EH1FaDkSggILH7pC+isiipNODI=</Hash>
<Size>118034594</Size>
<Type>application/x-smpte-mxf;asdcpKind=Sound</Type>
</Asset>
</AssetList>
根据ASSETMAP的顺序,我们可以知道他的解析顺序是PKL,CPL,J2C,PCM
同时,PKL与CPL分别是不通作用的解析,按照一定顺序,缺一不可。
此处的内容与CPL中大体相似,而至于Hash的计算,我这里经过一定的推演,发现了计算公式
openssl sha1 -binary "文件名" | openssl base64
通过这个公式便可以计算pkl文件中存在的hash值。
可以发现是完全一致的,其他文件也同理
当然,后半部分是与cpl的后半部分一致的,包括签名以及编码证书,均为一直。
媒体文件
两个mxf则为最后的重中之重,在前面的cpl文件中可以发现j2c是被认为成图片序列文件。
pcm文件则是音频文件,我们其实可以通过常规的播放器直接进行播放,但是视频与图片是分开的,
例如这样,仅有声音。所以影院的TMS系统就是作为合并播放解析用的。
这里补充一下
视频文件的序列帧编码一般是JPEG 2000,
音频文件也可以弄多个音轨用来存放不同的声道和语言,以达到立体声和多语言的目的。
关于最后的VOLINDEX,我这里还不知道是啥,也没查到相关资料,暂且不做过多介绍。
关于加密密钥的KMS内容,后续更新。