?

點播影院發行包中MXF 封裝器的設計與實現

2024-02-06 05:38王木旺
現代電影技術 2024年1期
關鍵詞:音視頻哈希分區

王木旺

中國電影科學技術研究所(中央宣傳部電影技術質量檢測所),北京 100086

1 引言

近年來,為補充并發展壯大國內電影市場,國家電影局發布了《點播影院、點播院線管理規定》用于促進點播影院發展。同時,為了規范和提高點播影院系統及設備的國產化研制水平,發布《點播影院暫行技術規范》用于引導和規范點播影院系統及設備的研制。在點播影院系統及設備的研制中,點播影院影片發行包的制作是其重要組成部分,它決定了影片的編碼方式、加密方式、畫面質量、文件大小以及打包格式等。素材交換格式(Material eXchange Format,MXF)封裝又是點播影院影片發行包制作中的一個重要環節,它需要根據影片所采用的編碼方式、加密方式等來采用不同的封裝規則進行封裝。

但由于目前能夠適用于電影發行包制作的MXF封裝工具和軟件并不多,且多是針對專業影院影片發行包制作的,尤其是由DCI 官方認可測試機構Cinecert 提供的Asdcp 開源軟件只有針對JPEG 2000編碼的MXF 封裝庫,并不能完全適用于點播影院發行包的MXF 封裝制作。為降低放映設備成本,目前點播影院多采用市場上穩定且價格較低的AVC 和HEVC 解碼芯片,并且近年來,在鼓勵國家商用密碼技術開發和推廣應用的背景下,有廠商也開始采用SM4 等國密算法進行影片加密。這些新的需求也要求必須設計相應的MXF 封裝器來滿足未來的技術發展需要。

本文根據《點播影院暫行技術規范》中對點播影院的影片打包技術要求,并結合相關研究課題,設計和實現了一種MXF 封裝器。

2 MXF 數據映射

點播影院電影發行包的制作需要經過音視頻編碼、加密(可選)、MXF 封裝、打包等步驟。其中MXF封裝就是將音視頻文件根據所采用素材容器(Es‐sence Container)的不同,按照相應規則將數據映射到MXF 文件中的過程。MXF 是美國電影電視工程師協會(SMPTE)組織定義的一種專業音視頻媒體文件格式,主要應用于影視行業媒體制作、編輯、發行和存儲等環節,點播影院發行包中音視頻的存儲就采用該格式。

作為一種“容器”文件格式,MXF 文件格式與內容數據的格式無關,其底層使用了鍵‐長度‐值(KLV)三元組編碼方式。其中鍵(K)是16 字節的標識符;長度(Length)是數據長度,采用基本編碼規則(Basic Encoding Rules,BER)編碼方式,它使用可變長的字節來表示非常寬的長度范圍,按高字節優先(MSB)編碼,如果第一個字節的bit7 為0,那么低7 位代表了數據的長度,如果bit7 為1,那么低7 位代表長度域的字節個數;值(Value)是要存儲的具體數據。

MXF 文件分為文件頭(File Header)、文件體(File Body)和文件腳(File Footer)三部分。但從數據存儲邏輯上,又分為頭分區(Header Partition)、體分區(Body Partition)、腳分區(Footer Partition)和隨機索引(Random Index)四部分。頭分區、體分區和腳分區中都是以分區包開始,后接該區存放的數據(圖1)。

圖1 MXF 數據分區

其中MXF 封裝時,可對音視頻數據直接封裝,也可以先對音視頻數據加密,再對加密后的數據進行封裝,其封裝的數據存放于體分區的素材容器中。點播影院電影發行包通常是按幀或視頻片段進行數據映射,有特殊需求的也可以自定義。

未加密的數據按單元順序存放于素材容器中的數據存儲結構如圖2所示。

圖2 音視頻數據在素材容器中的存儲結構

若需要對音視頻數據加密,則需要使用不同的鍵來做標識。為做區分,加密后的鍵用K′表示;加密信息和加密數據組合的數據作為KLV 三元組的值部分,并用V′表示;最后再將加密后的KLV 三元組映射到素材容器中,其音視頻數據加解密關系如圖3所示。

圖3 加密數據和未加密數據的關系圖

對于映射到素材容器中的數據,在MXF 文件中還必須對其進行說明和描述,便于發送者和接收者之間進行數據交互。這類信息都存放于頭分區的元數據(Metadata)中,元數據也被稱為描述數據的數據,按照功能作用分為結構元數據(Structural Meta‐data)和描述元數據(Descriptive Metadata)兩種。結構元數據是MXF 文件的組成部分,用于定義內容實質結構的信息;描述元數據是可選項,用于描述文件中某些內容。

元數據必須以首包(Primer Pack)開始,首包中存儲了MXF 文件中用到的所有唯一標識(Unique Identifier,UID)和本地標簽(Local Tag)的映射關系,用于MXF 文件中各數據之間的鏈接、查找和關聯。緊接其后的是前言包(Preface Pack),前言包存儲了MXF 文件的總括性描述信息,包括音視頻數據類型、操作模式、文件結構等。其后則根據業務需要,將各種元數據進行組合和添加,存儲結構如圖4所示。

圖4 元數據存儲結構

點播影院電影發行包中MXF 文件中用到的元數據有:標識(Identification)、文件描述(File Descrip‐tor)、內容存儲(Content Storage)、源包(Source Pack‐age)、軌跡(Track)、序列(Sequence)、源片段(Source Clip)、素材包(Material Package)、時間線軌跡包(Timeline Track)、素材容器數據(Essence Container Data)。如果數據加密,還需要包括:描述元數據靜態軌跡(DM Track)、描述元數據序列(DM Se‐quence)、描述元數據分段(DM Segment)、密碼框架(Cryptographic Framework)、密碼語境(Cryptographic Context)、加密算法(Cipher Algorithm)、消息完整性校驗算法(MIC Algorithm)。MXF 元數據關系結構如圖5所示。

圖5 MXF 元數據關系結構圖

由于映射到素材容器中的數據是由一系列的數據單元組成,在讀取該數據時,為能準確快速定位到想要讀取的單元,而不用每次從頭讀起,還需要對素材容器中的數據進行索引,其索引信息存放于文件腳的索引表中(圖6)。

圖6 索引表與數據單元關系

同樣的原理,為了能夠快速定位文件的頭、體、腳三個區的起始位置,整個文件的最尾端存放隨機索引包,隨機索引包包含了文件每一分區的ID 號和起始位置,最后四個字節存放了自身的數據長度,便于讀取該數據。

3 MXF 封裝器設計

3.1 邊界

MXF 封裝器是點播影院電影發行包制作環節中重要的功能部分,它的核心功能是根據輸入的音視頻文件和封裝、加密參數,按照相應的數據映射規則,將音視頻數據處理后,輸出到MXF 文件中。故MXF 封裝器應該包含三個輸入接口:音視頻文件輸入接口、封裝參數接口、加密參數接口;一個輸出接口:MXF 文件輸出接口;一個交互接口:外部加密、哈希計算功能調用接口(圖7)。

圖7 點播影院發行包中MXF 封裝器的功能接口

3.2 功能模塊

為實現MXF 封裝器的核心功能,在其內部需要具備如下幾個功能模塊。

(1)文件解析

MXF 封裝器在對音視頻文件進行封裝之前,必須知道所處理的數據是音頻還是視頻,如果是音頻文件,需要獲取該音頻的編碼類型、采樣率、聲道數量、幀速率、幀數等;如果是視頻文件,需要獲取該視頻的編碼類型、分辨率、幀速率、幀數、寬高比等。其中所獲取的編碼類型用于MXF 封裝在后續選取相應的映射規則,其它參數信息則用于MXF 封裝在后期生成相應的元數據。

基于AVC 或HEVC 編碼的視頻數據,通??梢圆捎肕OV 格式文件,無損壓縮的音頻數據通常采用WAV 格式文件,故本功能模塊需要具有支持MOV 格式的視頻文件和WAV 格式的音頻文件解析能力。

(2)文件讀取

MXF 封裝器對音視頻文件的讀取要求比較特殊,由于電影對聲畫質量的要求比較高,點播影院發行包使用的音視頻文件普遍較大,視頻文件通常在幾GB 到幾十GB,封裝器不能對該文件一次性全部讀取,必須能夠按照數據流的方式循環讀取。這要求文件讀取模塊能夠與后續的MXF 數據封裝模塊共享數據隊列,文件讀取模塊能夠將數據按塊讀入隊列,MXF 封裝模塊按照先進先出原則,依次讀出數據。當隊列滿時,文件讀入模塊等待;當文件隊列空時,MXF 封裝模塊等待。

(3)信息參數設置

(4)MXF 數據封裝

MXF 數據封裝中又分為元數據封裝、內容數據封裝和其它數據封裝。

元數據的封裝比較復雜,首先元數據數量比較多且數據結構都不相同;其次是各個元數據之間有相互依賴關系;最后是每一個元數據中數據項中的數據還有不同的編碼規則,如自定義的Rational 和Position 類型。

內容數據封裝需要根據音視頻的編碼類型,采用不同的素材映射方式進行封裝,AVC 有相關規范可以參考,HEVC 則需要參照其它規范來設計映射規則。對于采用AES‐128 加密、SHA‐1 計算哈希的音視頻數據,可參照數字電影相關的素材加密規范;對于采用SM4 加密、SM3 計算哈希的音視頻數據,則需要設計相關加密規則。

除了元數據和內容數據外,像圖1 中描述到的文件頭分區包、文件體分區包、文件腳分區包、索引表和隨機索引表,這些統稱為其它數據,它們主要用于對文件中各個區域或內容數據的位置標定,方便數據的快速查找和定位。

(5)MXF 輸出

MXF 輸出模塊和文件讀取模塊類似,在對內容數據封裝過程中,需要一邊封裝一邊輸出。該模塊需要和前序的MXF 數據封裝模塊配合,共享數據隊列,按照數據流的方式依次讀取并輸出。

(6)加密模塊

式中:h熱、h冷分別為試件的熱面、冷面對流換熱系數,W/(m2·K);δ為試件厚度,m;λ為填充板熱導率W/(m·K).

該模塊的功能實現是在MXF 封裝器之外,但由于它和封裝器關系緊密,并且會被封裝器調用,這里也一并列出。加密模塊中包含了對稱加密和哈希計算,其中對稱加密包含AES‐128 和SM4 算法;哈希計算包含SHA‐1和SM3算法。

4 MXF 封裝器實現

根據上述章節的功能設計,MXF 封裝器實現了用于參數設置的MxfSetter 類,用于音視頻解析的FileParser 類,用于文件循環讀取的FileReader 類,以及最重要的用于MXF 數據生成的MxfMaker 類和用于循環寫出MXF 文件的FileWriter 類。各類之間的調用時序如圖8所示。

圖8 功能類時序圖

MXF 封裝器最重要的功能是MXF 數據生成類(MxfMaker)的實現,根據上述章節的設計,該類包含了生成MXF 頭分區(WriterPartitionHeader)、MXF 體分區(WriterPartitionBody)、MXF 腳分區(WriterParti‐tionFooter)和隨機索引包(WriteRandomIndexPack)四個主要函數方法。其中頭分區函數WritePartition‐Header 通過對分區包類(HeaderPartitionPack)和元數據類(Metadata)的調用,實現對MXF 頭分區的封裝;體分區函數WritePartitionBody 通過對分區包類和素材容器類(EssenceContainer)的調用,實現對MXF 體分區的封裝;腳分區函數WriterPartitionFooter 通過對分區包類和索引表類(IndexTable)的調用,實現對MXF 腳分區的封裝;隨機索引包函數WriteRando‐mIndexPack 通過對隨機索引包類(RandomIndex‐Pack)的調用,實現對MXF 隨機索引表的封裝。Mxf‐Maker類與其它類的調用關系如圖9所示。

圖9 各類之間的關系示意圖

HeaderPartitionPack 類在生成數據時,需要根據調用的函數來生成不同的分區包,其鍵值為固定值,MXF 文件在使用時也會根據該鍵值來判斷是否為標準的MXF 文件。另外還需要初始化分區包起始位置、前一個分區位置、元數據的大小、索引包的大小、素材容器的ID 和位置、素材容器的標簽、操作模式等。在點播影院發行包中規定了不加密時分區包中的操作模式有兩種,一種是符合SMPTE 規范,該值為:0x06 0e 2b 34 04 01 01 02 0d 01 02 01 10 00 00 00;另外一種符合Interop 規范,該值為:0x06 0e 2b 34 04 01 01 01 0d 01 02 01 10 00 00 00。在點播影院發行包中也規定了素材容器的標簽,當素材為加密數據時,該值為:0x06 0e 2b 34 04 01 01 07 0d 01 03 01 02 0b 01 00,如果為不加密數據,需要根據使用的素材容器來決定標簽,當映射AVC 時,該標簽為:0x06 0e 2b 34 04 01 01 0a 0d 01 03 01 02 10 60 04,當映射音頻數據時,該標簽為:0x06 0e 2b 34 04 01 01 01 0d 01 03 01 02 06 01 00。

Metadata 類在生成數據時,則需要將用到的所有元數據都進行賦值。為節省空間,每個元數據的標簽在MXF 文件中采用2 個字節的Local 標簽代替16個字節的唯一標識(Unique Identifier,UID),但為了在解析各元數據的時候能夠準確知道Local 標簽的含義,則需要在Primer 包中對這兩種標簽一一對應,其對應關系的數據結構如表1所示。

表1 Local標簽與唯一標識對應的數據結構

IndexTable 類在生成數據時,需要標記出素材容器中每一個數據單元相對字節偏移量,由于點播影院發行包中規定,MXF 文件中只能有一個素材容器,索引表也不能進行分割,并且只能存儲在MXF 腳分區中,因此該類數據在生成時相對簡單。但需要注意的是在對加密的數據進行索引時,還需要考慮加密過程中增加的加密信息和填充字節,從而引發原偏移量改變。

RandomIndexPack 類所生成的數據,在MXF 的相關規范中規定必須存放于MXF 文件結尾部分,并且通過它能夠從整個MXF 文件中快速掃描到需要訪問的數據區域,所以該數據必須包含多個分區數據ID值和相對偏移位置的數據集合,其數據結構如表2所示。

表2 隨機索引包數據結構

5 測試及應用

5.1 功能測試

按照上述設計,通過編程實現MXF 封裝器后,為驗證該封裝器對采用AES‐128 或SM4 加密,以及采用SHA‐1 或SM3 哈希算法校驗后的數據能否在元數據中準確描述,本文采用了第三方的MXF 分析工具對其封裝完成的MXF 文件進行了解析。

其中采用AES‐128 加密和SHA‐1 哈希算法的MXF 文件解析后,Cryptographic Context 元數據中的Cipher Algorithm 字段UniversalLabel 值為:0x06 0e 2b 34 04 01 01 07 02 09 02 01 01 00 00 00;數據加密算法標示符識別為:AES‐128 CBC Identifier。Crypto‐graphic Context 元數據中的MIC Algorithm 字段Uni‐versalLabel 值為:0x06 0e 2b 34 04 01 01 07 02 09 02 02 01 00 00 00;哈希算法標識符識別為:HMAC‐SHA1 128‐bit Identifier??梢钥闯?,第三方MXF 解析器能夠準確識別出該加密算法和哈希算法。

采用SM4 加密和SM3 哈希算法的MXF 文件解析后,Cryptographic Context 元數據中的Cipher Algo‐rithm 字段UniversalLabel 值為:0x06 0e 2b 34 04 01 01 07 02 09 02 01 10 00 00 00;數據加密算法標示符識別為:Unknown RP 224.9 sub‐node of "Data Encryp‐tion Algorithm Identifiers";Cryptographic Context 元數據中的MIC Algorithm 字段UniversalLabel 值為:0x06 0e 2b 34 04 01 01 07 02 09 02 02 10 00 00 00;哈希算法標識符識別為:Unknown RP 224.9 sub‐node of"Data Hashing Algorithms"??梢钥闯?,第三方MXF解析器并未能識別出該加密方式,僅列出了該加密算法和哈希算法的UUID 值。這是由于SM4 和SM3的算法并未列入到SMPTE 相關標準中,而第三方MXF 解析器是基于SMPTE 相關標準研制,所以未能正確檢出,但根據本文的設計和對比,能夠確認該UUID 正確。并且在后期的應用中,相應的點播影院播放系統會對該加密算法做兼容處理,故該功能合格。

5.2 封裝器在發行包制作系統中的應用

本文通過編程實現后的MXF 封裝器,結合編轉碼、DCP 打包和KDM 制作功能模塊,最終集成了一套可應用于點播影院電影的發行包制作系統。該系統包含了編碼/轉碼模塊、MXF 封裝模塊、DCP 打包模塊、KDM 制作模塊以及系統設置模塊。通過該系統,可實現音視頻文件的編轉碼;可對音視頻文件進行AES‐128 加密或SM4 加密,并對加密后的數據分別封裝生成MXF 文件;可通過DCP 打包功能模塊,選擇封裝完成的MXF 文件,制作點播影院影片發行包;還可以通過KDM 制作功能,選擇采用RSA‐2048非對稱加密算法、SHA‐1 哈希校驗算法,或采用SM2非對稱加密算法、SM3 哈希校驗算法,來制作相應播放終端設備的KDM 授權密鑰。

本文通過該點播影院電影的發行包制作系統,選擇了一組影片分別采用國密和非國密兩種方式進行了點播影院影片發行包的制作,并對制作完成的發行包進行了文件解析和分析,均達到功能設計要求。進而又制作了多部影片的電影發行包和授權密鑰,并在本文配套的其它研究成果——點播影院激光放映一體機上進行了放映實驗,均能正常流暢放映。

6 結語

MXF 封裝是數字電影發行包制作中的重要一環,本文研究的一種適用于點播影院影片發行包制作的MXF 封裝器,可以適用于采用AVC 和HEVC 編碼的影片,未來還可以進一步拓展應用于采用AVS3和VVC 編碼的影片。另外該封裝器也可以適用國外和國家密碼算法,能夠為國家商用密碼在國內電影市場的推廣應用起到一定的探索作用,期望文中的論述能夠對研制點播影院相關系統和設備的人員有所參考。

猜你喜歡
音視頻哈希分區
上海實施“分區封控”
3KB深圳市一禾音視頻科技有限公司
WIFI音視頻信號傳輸的關鍵問題探究
浪莎 分區而治
高速公路整合移動音視頻系統應用
基于OpenCV與均值哈希算法的人臉相似識別系統
基于維度分解的哈希多維快速流分類算法
基于SAGA聚類分析的無功電壓控制分區
基于多種群遺傳改進FCM的無功/電壓控制分區
Roland專業音視頻新技術研討會在上海召開
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合