MOV及MP4文件格式中几个重要的Table
MP4,全稱是MPEG4 Part 14,是一種使用MPEG-4的多媒體文件格式,擴展名為.mp4。
MOV,是QuickTime影片格式,它是Apple公司開發的一種音頻、視頻文件格式,用于存儲常用數字媒體類型。其擴展名為.mov。
在MOV和MP4文件格式中包括幾個重要的Table,對應的atoms分別為:stts、ctts、stss、stsc、stsz以及stco/co64。
1、Sample時間表stts
stts:Time-To-Sample Atoms,存儲了媒體sample的時常信息,提供了時間和相關sample之間的映射關系。該atom包含了一個表,關于time和sample號之間的索引關系。表的每個entry給出了具有相同時間間隔的連續的sample的個數和這些sample的時間間隔值。將這些時間間隔相加在一起,就可以得到一個完整的time與sample之間的映射。將所有的時間間隔相加在一起,就可以得到該track的時間總長。
每個sample的顯示時間可以通過如下的公式得到:
D(n+1) = D(n) + STTS(n)
其中,STTS(n)是sample n的時間間隔,包含在表格中;D(n)是sample n的顯示時間。
Time-To-Sample的table entry布局如圖1-1所示:
圖1-1?Time-To-Sample的table entry布局
Table entries根據每個sample在媒體流中的順序和時長對他們進行描述。如果連續的samples有相同的時長,他們會被放在同一個table entry中。特別的,如果所有的sample具有相同的時長,那么table中就只有一個entry。
一個簡單的例子如圖1-2所示。這個媒體流包括9個samples,通過3個entries來描述。需要說明的一點是,這里的entry和chunk不是對應的。比如,sample 4、5和6在同一個chunk中,但是,由于他們的時長不一樣,sample 4的時長為3,而sample 5和6的時長為1,因此,通過不同的entry來描述。
圖1-2 關于Time-To-Sample的一個簡單例子
2、時間合成偏移表ctts
ctts:Composition Offset Atom。每一個視頻sample都有一個解碼順序和一個顯示順序。對于一個sample來說,解碼順序和顯示順序可能不一致,比如H.264格式,因此,Composition Offset Atom就是在這種情況下被使用的。
(1)如果解碼順序和顯示順序是一致的,Composition Offset Atom就不會出現。Time-To-Sample Atoms既提供了解碼順序也提供了顯示順序,并能夠計算出每個sample的開始時間和結束時間。
(2)如果解碼順序和顯示順序不一致,那么Time-To-Sample Atoms既提供解碼順序,Composition Offset Atom則通過差值的形式來提供顯示時間。
Composition Offset Atom提供了一個從解碼時間到顯示時間的sample一對一的映射,具有如下的映射關系:
CT(n) = DT(n) + CTTS(n)
其中,CTTS(n)是sample n在table中的entry(這里假設一個entry只對應一個sample)可以是正值也可是負值;DT(n)是sample n的解碼時間,通過Time-To-Sample Atoms計算獲得;CT(n)便是sample n的顯示時間。
Composition Offset Atom的table entry的布局和Time-To-Sample Atoms的一樣,如圖2-1所示:
圖2-1?Composition Offset Atom的table entry布局
3、同步Sample表stss
stss:Sync Sample Atom,標識了媒體流中的關鍵幀,提供了隨機訪問點標記。Sync Sample Atom包含了一個table,table的每個entry標識了一個sample,該sample是媒體流的關鍵幀。Table中的sample號是嚴格按照增長的順序排列的,如果該table不存在,那么每一個sample都可以作為隨機訪問點。換句話說,如果Sync Sample Atom不存在,那么所有的sample都是關鍵幀。
Sync Sample Table的布局如圖3-1所示:
圖3-1?Sync Sample Table的布局
4、Chunk中的Sample信息表stsc
stsc:Sample-To-Chunk Atom。為了優化數據訪問,通常把sample封裝到chunk中,一個chunk可能會包含一個或者幾個sample。每個chunk會有不同的size,每個chunk中的sample也會有不同的size。在Sample-To-Chunk Atom中包含了個table,這個table提供了從sample到chunk的一個映射,每個table entry可能包含一個或者多個chunk。Table entry包含的內容包括第一個chunk號、每個chunk包含的sample的個數以及sample的描述ID。Sample-To-Chunk Atom的table entry布局如圖4-1所示。
圖4-1?Sample-To-Chunk Atom的table entry布局
每個table entry包含一組chunk,enrty中的每個chunk包含相同數目的sample。而且,這些chunk中的每個sample都必須使用相同的sample description。任何時候,如果chunk中的sample數目或者sample description改變,必須創建一個新的table entry。如果所有的chunk包含的sample數目相同,那么該table只有一個entry。
一個簡單的例子,如圖4-2所示。圖中看不出來總共有多少個chunk,因為entry中只包含第一個chunk號,因此,對于最后一個entry,在某些情況下需要特殊的處理,因為無法判斷什么時候結束。
圖4-2 一個關于Sample-To-Chunk table的例子
5、Sample大小表stsz
stsz:Sample Size Atom,指定了每個sample的size。Sample Size Atom給出了sample的總數和一張表,這個表包含了每個sample的size。如果指定了默認的sampe size,那么這個table就不存在了。即每個sample使用這個默認的sample size。sample size table的布局如圖5-1所示。
圖5-1?sample size table的布局
6、Chunk的偏移量表stco/co64
stco/co64:Chunk Offset Atom,指定了每個chunk在文件中的位置。Chunk Offset Atom包含了一個table,表中的每個entry給出了每個chunk在文件中的位置。有兩種形式來表示每個entry的值,即chunk的偏移量,32位和64位。如果Chunk Offset Atom的類型為stco,則使用的是32位的,如果是co64,那么使用的就是64位的。chunk offset table的布局如圖6-1所示。
圖6-1?chunk offset table的布局
需要注意的是,table中只是給出了每個chunk的偏移量,并沒有給出每個sample的偏移量。因此,如果要獲得每個sample的偏移量,還需要用到Sample Size Table和Sample-To-Chunk Table。
---------------------?
作者:MultiMedia之旅?
來源:CSDN?
原文:https://blog.csdn.net/yu_yuan_1314/article/details/9078287?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的MOV及MP4文件格式中几个重要的Table的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mp4文件解析
- 下一篇: ffmpeg基础库编程开发 读书笔记