ByteScope

QuickTime Movie 檔案格式

Apple QuickTime 容器,現代 MP4 格式的前身。

MIME 類型
video/quicktime
副檔名
.mov
分類
影片

Magic number(檔案簽章)

0x0000000466747970ftypISO-BMFF 'ftyp' box
0x0000000871742020qt 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,以及指向完全另一個檔案裡的媒體的參照影片。

檔頭結構,一個位元組一個位元組看

位移長度欄位意義
04ftyp box sizeFileTypeBox 的長度,大端序,含這四個位元組。00 00 00 14 是 20,也是最小的堪用大小:一個類型、一個主要品牌識別、一個次版本號,加剛好一個相容品牌識別。MP4 檔案這裡通常比較長,因為它們會列好幾個相容品牌識別。
44Box type 'ftyp'66 74 79 70,每個 ISO base media 檔案都帶的那個 FileTypeBox。它出現與否完全不代表這是哪一種格式;只有後面那個品牌識別才算數。
84Major brand 'qt '71 74 20 20 — 字母 q、t 後面接兩個 ASCII 空格,那兩個空格是品牌識別的一部分,不是可以修掉的填充。很多工具會把四字元代碼尾端的空白剝掉,然後就比對不到它了。
124Minor version一個大端序 32 位元數字,純資訊用。ffmpeg 在這裡寫 00 00 02 00;Apple 自家的寫入端則放一個長得像建置日期的值。兩種都不是限制,讀取端也不該因為它拒收檔案。
16variableCompatible brandsbox 剩下的部分,每個品牌識別四個位元組。QuickTime 檔案常常就只是再列一次 'qt '。當一個 MOV 在這裡也列了 isom 或 mp42,它是在告訴你內容都在單純的 MP4 讀取端處理得來的範圍內。
208Second box headerftyp 是 20 個位元組時,這就是下一個 box,而在 QuickTime 的輸出裡它很常是 'wide' — 一個 8 位元組的佔位 box,存在的唯一目的是讓後面的 'mdat' 之後可以升級成 64 位元大小而不必移動整個檔案。不然就會是 'moov'、'mdat' 或 'free'。
44Legacy first box type2004 年以前的 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 搞混的格式,可以比對它們的開頭位元組。

格式開頭位元組副檔名
MP466 74 79 70.mp4
M4V66 74 79 70.m4v
AVI52 49 46 46.avi

常見問題

檔案的 magic number 是什麼?

檔案開頭的前幾個位元組,不管檔名寫什麼,它標明的是真正的格式。PNG 一定以 89 50 4E 47 開頭,ZIP 則是 50 4B 03 04。作業系統、瀏覽器和 file 指令讀的都是這幾個位元組,而不是相信副檔名 — 這就是為什麼把檔案改名並不會改變它實際上是什麼。

我要怎麼自己檢查 magic number?

在 macOS 或 Linux 上,xxd -l 16 檔名 會印出前 16 個位元組;在 Windows 上,PowerShell 的 Format-Hex -Path 檔名 -Count 16。或者把檔案丟進本站的檔案類型辨識工具,它會在本機讀取位元組並告訴你是什麼格式,不會上傳任何東西。

為什麼兩種格式的 magic number 會一樣?

因為其中一種是建立在另一種之上。docx、xlsx、pptx、apk、jar 與 epub 骨子裡都是 ZIP 壓縮檔,所以全都以 ZIP 的簽章開頭;要分辨它們得看裡面的項目。Java class 檔和 macOS 的通用二進位檔都以 CA FE BA BE 開頭,靠緊接其後的欄位區分。

有完全沒有 magic number 的檔案嗎?

有。XML、HTML、JSON、SVG、CSV 這類以文字為基礎的格式沒有固定的位元組簽章,所以改用結構來辨識:開頭的 <?xml 宣告、<svg 元素,或是 { 後面接著帶引號的鍵。這種偵測是合理推測而非確定,因此本參考頁會把這些格式標示為結構偵測。

magic number 相符就代表檔案安全嗎?

不代表。它告訴你的是格式,不是內容是否無害 — 一個貨真價實的 PDF 或 docx 仍然可能夾帶惡意內容。辨識真實類型是有用的第一道檢查,尤其在副檔名和位元組不一致的時候,但它不是惡意軟體掃描。

手上有檔案可能是 QuickTime Movie?用檔案類型辨識工具查出來 — 它在本機讀取 magic number,不上傳任何東西。或者瀏覽所有格式。