QuickTime Movie 檔案格式
Apple QuickTime 容器,現代 MP4 格式的前身。
- MIME 類型
- video/quicktime
- 副檔名
- .mov
- 分類
- 影片
Magic number(檔案簽章)
| 0x00000004 | 66747970 | ftyp | ISO-BMFF 'ftyp' box |
| 0x00000008 | 71742020 | qt | brand 'qt ' |
關於 QuickTime Movie 格式
MOV 是 Apple 的 QuickTime 容器,也是 MP4 的直系前身 — ISO 當年就是拿 QuickTime 檔案格式當起點做出 ISO base media file format 的,所以兩者共用同一套 box 結構、大部分的 box 名稱和很多語意。現代的 QuickTime 檔案,用的是每個 MP4 都有的那個 FileTypeBox 來報上名號,品牌識別是 'qt ',尾巴帶兩個空格。在那個 box 被引進之前寫出來的檔案則完全沒有標頭 magic:它們直接從第一個真正的 box 開始,所以 MOV 的偵測器沒辦法像 PNG 那樣靠單一組固定位元組。MOV 真正和 MP4 不同的地方在它被允許裝什麼 — 時間碼軌、ProRes 與 DNxHD 視訊、不必重新編碼就能裁切與重排的 edit list,以及指向完全另一個檔案裡的媒體的參照影片。
檔頭結構,一個位元組一個位元組看
| 位移 | 長度 | 欄位 | 意義 |
|---|---|---|---|
| 0 | 4 | ftyp box size | FileTypeBox 的長度,大端序,含這四個位元組。00 00 00 14 是 20,也是最小的堪用大小:一個類型、一個主要品牌識別、一個次版本號,加剛好一個相容品牌識別。MP4 檔案這裡通常比較長,因為它們會列好幾個相容品牌識別。 |
| 4 | 4 | Box type 'ftyp' | 66 74 79 70,每個 ISO base media 檔案都帶的那個 FileTypeBox。它出現與否完全不代表這是哪一種格式;只有後面那個品牌識別才算數。 |
| 8 | 4 | Major brand 'qt ' | 71 74 20 20 — 字母 q、t 後面接兩個 ASCII 空格,那兩個空格是品牌識別的一部分,不是可以修掉的填充。很多工具會把四字元代碼尾端的空白剝掉,然後就比對不到它了。 |
| 12 | 4 | Minor version | 一個大端序 32 位元數字,純資訊用。ffmpeg 在這裡寫 00 00 02 00;Apple 自家的寫入端則放一個長得像建置日期的值。兩種都不是限制,讀取端也不該因為它拒收檔案。 |
| 16 | variable | Compatible brands | box 剩下的部分,每個品牌識別四個位元組。QuickTime 檔案常常就只是再列一次 'qt '。當一個 MOV 在這裡也列了 isom 或 mp42,它是在告訴你內容都在單純的 MP4 讀取端處理得來的範圍內。 |
| 20 | 8 | Second box header | ftyp 是 20 個位元組時,這就是下一個 box,而在 QuickTime 的輸出裡它很常是 'wide' — 一個 8 位元組的佔位 box,存在的唯一目的是讓後面的 'mdat' 之後可以升級成 64 位元大小而不必移動整個檔案。不然就會是 'moov'、'mdat' 或 'free'。 |
| 4 | 4 | Legacy first box type | 2004 年以前的 QuickTime 檔案沒有 ftyp box,而同樣這個位置放的是第一個真正的 box 的類型:'moov'、'mdat'、'free'、'skip'、'wide' 或 'pnot'。位移相同、意義不同,而這種歧義正是 MOV 的偵測只能給信心水準、不能給確定答案的原因。 |
怎麼跟長得像的格式分開
| 容易搞混的 | 怎麼分 |
|---|---|
| MP4 | 到位移 7 為止完全一樣。判斷完全落在位移 8 的主要品牌識別:'qt ' 是 QuickTime,isom、iso2、mp41、mp42 或 avc1 則是 MP4。標頭之外,真正的差別在內容 — 一個裝著 ProRes、DNxHD 或時間碼軌的 MOV 是合法的 QuickTime,卻不是一般 MP4 播放器解得開的東西,即使裡面每個 box 都剖析得乾乾淨淨。 |
| M4V | 位移 8 的品牌識別是 'M4V ' 而不是 'qt '。兩者都出自 Apple 生態系,也都常常裝著 H.264 和 AAC,所以副檔名告訴你的是檔案從哪來,而不是裡面有什麼。把其中一個改名成另一個,成功的機率高得不太合理 — 這也正是為什麼不成功的時候,大家最後都跑去開 hex 編輯器。 |
| AVI | 另一個在較舊的擷取與剪輯流程裡還會出現的容器,而結構上一點都不像:AVI 是 RIFF,位移 0 是 52 49 46 46,位移 8 的格式類型是 'AVI '。它那邊的大小是小端序,而 QuickTime 檔案裡每個大小都是大端序 — 不確定自己在讀哪一種時,這是個好用的合理性檢查。 |
| 3GP | 它一樣有 ftyp box,品牌識別是 3gp4、3gp5 或 3gp6。實務上的差別是範圍:3GP 把編碼與 box 用法限縮到手機吃得下的程度,而 QuickTime 刻意反其道而行,幾乎什麼都允許,包括指向存在完全另一個檔案裡的媒體。 |
常見的壞法
- 錄影從來沒拿到它的 moov box。這是經典的壞 MOV:相機或螢幕錄影程式斷電了,畫面全部寫進 mdat,卻在附加索引之前就死掉,留下一個好幾 GB、沒有播放器打得開的檔案。影格全都在、也救得回來,但只能靠同一台裝置、同樣設定拍出來的健康檔案,把樣本表結構借過來用。
- 參照影片的媒體被搬走了。QuickTime 允許 MOV 指向住在別的檔案裡的樣本,所以一次剪輯可以完全不複製任何影片就存下來。把來源搬走或改名,這個 MOV 仍然完全合法 — 打得開、長度也報得對,就是什麼都播不出來,看起來像壞掉,其實不是。
- 截斷。因為 ftyp box 很小又住在最前面,不管尾巴掉了多少,標頭都還是健康的。真正能告訴你答案的是把 box 走一遍:最後一個 box 宣告的大小會超出檔案結尾。
- 文字模式傳輸,或品牌識別被剝掉。任何會去改寫「它以為是文字」的位元組的流程,都可能把位移 8 那個 'qt ' 品牌識別尾端的兩個 ASCII 空格修掉,於是嚴格的讀取端就拒收了一個其實一個位元組都沒差的檔案。
- edit list 把畫面藏起來了。一個損壞或寫得很怪的 'elst' box,可能讓播放從超過媒體結尾的位置開始,產出一個打得開、報得出長度、卻只有一片黑的檔案。這是標頭層級的問題、不是解碼器的問題,而且它會在單純的重新封裝之後活下來。
這個格式現在還在用嗎
MOV 活在製作端,不是交付端。Final Cut Pro 和 Avid 用它工作,ProRes 和 DNxHD 用它散佈,Canon、Blackmagic 和 RED 的相機錄它,macOS 的螢幕錄影預設也是 MOV。在那個領域沒有東西取代得了它,因為它做得到而 MP4 做不到的那些事 — 時間碼軌、alpha 通道、超大的中間編碼、edit list、參照影片 — 正好就是剪輯流程需要的。但只要東西要離開那個流程,它就是錯的選擇:裝 H.264 或 H.265 的 MP4 到處都播得動,而一個 ProRes 的 MOV 既巨大、在多數機器上又解不開。實務上,幾乎每個從 MOV 開始的專案,最後一步都是匯出成 MP4,而 MOV 留下來當母帶。
在這個站上打開 QuickTime Movie 檔
這些全部在你的瀏覽器裡跑,檔案不會離開你的電腦。
相關格式
容易和 QuickTime Movie 搞混的格式,可以比對它們的開頭位元組。