ByteScope

M4V 檔案格式

Apple 的 MPEG-4 視訊變體,常見於帶 DRM 的 iTunes 影片。

MIME 類型
video/x-m4v
副檔名
.m4v
分類
影片

Magic number(檔案簽章)

0x0000000466747970ftypISO-BMFF 'ftyp' box
0x000000084D345620M4V brand 'M4V '

關於 M4V 格式

M4V 就是 iTunes Store 當年出貨的那種 MP4。容器是 ISO base media file format,box 是同一批 box,視訊通常是 H.264、音訊是 AAC — 跟一般 .mp4 唯一的結構差異,是 FileTypeBox 裡的品牌識別字串,以及在購買的內容上,樣本描述裡多出來的一層 FairPlay 加密。Apple 用另一個副檔名,是為了讓自家軟體能把檔案導去 iTunes,也為了讓有保護和沒保護的媒體一眼分得出來。就這樣而已:沒有保護的 M4V 改名成 .mp4 什麼都播得動,有保護的則不管叫什麼名字都到處播不動,因為影片的位元組是真的被加密了,不是只貼了個標籤。

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

位移長度欄位意義
04ftyp box sizeFileTypeBox 的長度,大端序,含這個欄位本身。00 00 00 20 是 32 個位元組,剛好放得下一個主要品牌識別、一個次版本號和三個相容品牌識別 — Apple 和 ffmpeg 的寫入端產出來的都是這個形狀。
44Box type 'ftyp'66 74 79 70。ISO/IEC 14496-12 規定它必須是檔案裡的第一個 box,這也讓標頭裡唯一認得出來的 ASCII 落在位移 4 而不是位移 0。
84Major brand 'M4V '4D 34 56 20 — 大寫 M、數字 4、大寫 V,然後一個 ASCII 空格,而那個空格是品牌識別的一部分。同一家族純音訊的兄弟在完全相同的位置用 'M4A ' 和 'M4B ',而且都是用同樣的方式補齊到四個字元。
124Minor version一個大端序 32 位元數字,沒有規範性意義;被 ffmpeg 重新封裝過的檔案裡會出現 00 00 02 00。它不是版本門檻,也不可以拿來拒收檔案。
16variableCompatible brandsbox 剩下的部分,每個品牌識別四個位元組,常見的是重複一次 'M4V ' 之後接 isom、iso2 和 avc1。這裡出現 isom,等於檔案自己直說「單純的 MP4 讀取端處理得來」— 這就是為什麼改名那麼常成功。
328Second box headerftyp 之後那個 box 的大小與類型 — 'moov'、'mdat',或一個 'free' 佔位 box。ftyp 是 32 個位元組時它落在 32;請從位移 0 讀長度,不要相信位置。

怎麼跟長得像的格式分開

容易搞混的怎麼分
MP4只有位移 8 那四個位元組不同:'M4V ' 對上 isom、mp42 或 avc1。檔案裡其他東西都不必改,而位移 16 的相容品牌識別清單裡通常本來就有 isom。如果你想知道手上這個 M4V 到底播不播得動,標頭不會告訴你 — 去樣本描述裡找 'sinf' 保護 box,因為 FairPlay 的內容會把編碼項目換成受保護的那一種。
M4A同一家族裡純音訊的成員,位移 8 的品牌識別是 'M4A '(4D 34 41 20)。除此之外位元組排版一模一樣,所以光看標頭並不能證明裡面沒有影片 — 決定性的答案在每條軌的 'hdlr' box 裡的 handler 類型,'vide' 是影片、'soun' 是音訊。一個帶封面圖的 .m4a 仍然只有一條聲音軌。
QuickTime Movie位移 8 的品牌識別是 'qt '。兩種格式都是 Apple 的、都是 ISO base media 檔案,也都常常裝著 H.264 和 AAC,所以大家在這兩個副檔名之間搬得很隨意。真正會咬人的差別是內容:QuickTime 允許的編碼與軌類型,是任何 M4V 的消費端都沒預期過的。
3GP位移 8 的品牌識別是 3gp4、3gp5 或 3gp6。兩者都是同一個容器針對特定裝置收斂出來的受限設定檔,一個瞄準手機、一個瞄準 Apple 的播放器,而且一般情況下都裝 H.264 和 AAC — 副檔名記錄的是預期的去處,不是結構上的差異。

常見的壞法

  • DRM 被誤認成損壞。一個購買來的、有 FairPlay 保護的 M4V,標頭完好無缺,box 樹也走得順順的,但它就是不肯在非授權的 Apple 裝置以外的任何東西上播放。這裡沒有東西可以修;樣本資料是加密的,用 hex 編輯器一看就知道:本來該出現 H.264 起始碼的地方,是一堆高亂度的位元組。
  • moov box 從來沒寫出來。匯出或下載中途被打斷,留下的是 mdat 滿的、索引卻沒有的檔案,任何東西都打不開。跟所有 ISO base media 檔案一樣,影格其實都還在,要救就得拿同一個編碼器產的健康檔案,把樣本表重建出來。
  • 品牌識別被重新封裝改掉了。把 M4V 丟進一個只複製串流、卻不保留 FileTypeBox 的工具,產出的檔案位移 8 現在寫的是 isom。影片本身沒被動過、播起來也沒問題,但 iTunes 和其他任何看品牌識別做事的東西,都會把它當成另一種檔案。
  • 截斷。標頭在最前面而且好好的,所以一個內容掉了大半的檔案,檔案類型偵測照樣正確地報出 M4V。把 box 走一遍才會露餡:最後一個 box 宣告的位元組數比檔案實際擁有的還多。
  • 在慢速連線上 moov 在檔尾。這不是損壞,但看的時候跟損壞分不出來:索引在最後面,所以最後一個位元組到之前什麼都播不出來。把它搬到前面只會改寫位移,編碼後的影片一個位元組都不會變。

這個格式現在還在用嗎

M4V 重要的時代,是大家還在 iTunes 上買電影和影集的時候;如今同一批片庫改成串流而不是下載,它基本上已經是歷史遺跡了。檔案還是會冒出來:老的 iTunes 音樂庫、從 Apple 軟體匯出的家庭影片,還有習慣性吐出這個副檔名的 HandBrake 預設組。新東西沒有理由選它 — MP4 是同一個容器而且沒有歧義,每個播放器和每個瀏覽器也都偏好那個單純的副檔名。當你手上就是一個 M4V 時,實際要問的問題永遠只有一個:它有沒有被保護。沒有保護,它就是 MP4,改名就好。有保護的話,沒有任何轉檔工具幫得上忙,因為缺的是金鑰而不是編碼,而任何聲稱做得到的工具,講的都是破解而不是轉檔。

在這個站上打開 M4V 檔

這些全部在你的瀏覽器裡跑,檔案不會離開你的電腦。

相關格式

容易和 M4V 搞混的格式,可以比對它們的開頭位元組。

格式開頭位元組副檔名
MP466 74 79 70.mp4
QuickTime Movie66 74 79 70.mov
M4A66 74 79 70.m4a

常見問題

檔案的 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 仍然可能夾帶惡意內容。辨識真實類型是有用的第一道檢查,尤其在副檔名和位元組不一致的時候,但它不是惡意軟體掃描。

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