同一部影片,電腦能播、手機放不出來:逐層核對清單(每一層都附實測讀數)
電腦放得開、手機放不開,原因通常不在畫質,也不在檔案壞沒壞。在真正畫出第一格之前,有四層會各判一次;任何一層不過,看到的都是同一個結果——「打不開」。所以正確的第一步不是換一個工具再壓一遍,而是讀檔案,判斷是哪一層攔住了你。
1. 在一格畫面出現之前,四層已經各自定了
- 容器。裝置願不願意打開這個檔案——它決定的是「開不開」,不是「好不好」。
- 畫面軌道的標籤。同一段 HEVC 畫面,在 MP4 這一族容器裡可以被寫成兩種不同的宣告。兩枚檔案的畫面逐位元組相同,行為卻可以完全相反。
- 聲音軌。畫面全對,仍然可能因為其中一條音軌而整個檔案被拒、或者開起來沒有聲音。
- 字幕軌。文字字幕與圖片字幕是兩種資料,而 MP4 的字幕軌道是按文字來建的。
這四層是分別判的,所以症狀也是分別的:容器不對=根本不開;標籤不對=開了畫面卻不動;聲音不對=開了沒聲音;字幕不對=片子好好的,字幕沒了。把四種症狀混成「這工具不行」,是這一類產品最常被誤判的地方。
2. 第一步是讀檔案,不是換工具
讀一層看一層:任何能列出檔案內部結構的檢查工具,都會把容器、每條軌道的編碼名稱、軌道標籤、位元深度、像素格式、時長、位元組數分開列出來。這一步花掉的是幾分鐘,替你做掉的是後面幾個小時的反覆重試。
下面所有讀數來自同一台機器上的同一趟檢查,環境寫在第 8 節。
| 樣本 | 容器 | 畫面軌道標籤 | 檔級/像素格式 | 尺寸 | 位元組數 |
|---|---|---|---|---|---|
| B | mp4 | hev1 | Main 10/yuv420p10le | 1920×1080 | 12,973,400 |
| C | mp4 | hvc1 | Main 10/yuv420p10le | 1920×1080 | 12,973,400 |
這兩枚檔案來自同一段兩分鐘長的畫面,畫面一格都沒有重新編碼,位元組數一模一樣;唯一的區別是那一枚四字元的軌道標籤。
改副檔名不會改變上面任何一層;把畫面按高位元率再壓一遍,也改變不了攔住你的那一層。先定位,再動手。
3. 標籤這一層:同一段畫面,兩種寫法
在 MP4 這一族容器裡,HEVC 會被宣告成 hvc1 或 hev1。區別在於解碼設定寫在哪裡:hvc1 把它寫進軌道的樣本描述,讀取方在碰到第一格之前就能把解碼器配好;hev1 允許這份資料隨串流一起傳。需要在開工前拿到設定的讀取方,不會等它半路出現。
這一層不需要重壓一格畫面:把畫面按複製帶過去,只重寫那一枚軌道標籤。上面那對樣本正是這麼來的——同一段畫面寫兩次,產物逐位元組等長。
值得記住的是這一層的代價:它是一次複製,不是一場重壓。凡是能把範圍收在這一層解決的問題,都不該動用重新編碼。
4. 聲音這一層:畫面完美也會被一條音軌拖住
畫面已經被接受之後,決定「能不能播、有沒有聲音」的就只剩聲音軌。這一族的實際存量比多數人以為的更寬:同一批素材裡同時見過 TrueHD、E-AC3、AC-3、Opus、FLAC、MP2、MP3、DTS 與 PCM。
| 來源 | 容器 | 畫面 | 聲音 | 產物 | 聲音怎麼辦 |
|---|---|---|---|---|---|
| G | matroska | HEVC Main 10 | TrueHD | mp4/hvc1 | 改寫為 AAC(畫面未重壓) |
| I | matroska | HEVC Main 10 | E-AC3 | mp4/hvc1 | 原樣帶過(標籤 ec-3) |
兩趟裡畫面都沒有重新壓縮,差別全在聲音:一支必須改寫,一支可以直接帶走。還有一件事只有逐條數軌道才會發現——只檢查第一條音軌的做法,產出的就是「打得開卻一片安靜」的檔案。多語言片子裡你要的那一門,常常正坐在第二條上。
5. 字幕這一層:文字與圖片是兩種資料
| 來源 | 聲音 | 字幕 | 產物 | 字幕的去向 |
|---|---|---|---|---|
| K(matroska) | AC-3、Opus、AAC | Subrip、ASS | mp4 | 兩條都落成文字軌(mov_text/tx3g) |
| F(matroska) | FLAC | HDMV PGS(圖片) | — | 圖片沒有對應的軌道位置 |
文字那類(SRT、ASS)搬進目標容器還是文字,字級、顏色仍然歸你改。圖片那類——藍光那種被壓成一頁頁圖片的字幕,以及 DVD 與電視盒錄影帶的那種——本質是字幕的照片。MP4 的字幕軌道按文字建,圖片沒有裝它的位置。
可行的兩條:把圖片裡的字認讀回文字再帶過去(認讀是一項能力,不是一枚保證,認出來的字可能有錯,交付前該核對),或者不要這條字幕。畫面一個像素都不會動,也不會把字燒進畫面——那種做法出的是一條新的畫面軌,不是你原本的片子。
問「支援不支援字幕」沒有意義。要問的是:這一條是文字還是圖片,轉換之後它還是不是同一種東西。
6. 讀得出檔案,讀不出裝置
這份清單能帶你走到「知道哪一層要動」。它不替你決定某一台裝置收不收:位元深度與檔級、顏色標記、影格率、4:2:2、長 GOP 這些條件,落在具體裝置上才有答案。同一批樣本裡同時存在 Main 10 與 Main 8,顏色標記也分帶與不帶——這些差別在檔案裡讀得出來,在裝置上才見分曉。
- 一句「這是 HEVC」不構成答案;把標籤、位元深度、聲音與字幕都讀出來,才夠你把範圍收到一兩層。
- 同一套畫面換一台裝置跑通過,不等於這台裝置跑過——容器與編碼是兩個變數。
- 短樣本證明結構,不證明體積與畫質行為;這些結論只能來自長片與真機。
- 任何一張「裝置表」都不該被直接相信,包括這一頁:拿自己的檔案在那台裝置上播一次,是唯一算數的驗收。已實測過的容器與編碼清單在這裡。
7. 照著走的核對順序
- 讀內部。容器、畫面標籤、逐條聲音、逐條字幕,一趟列全。
- 容器這一層。檔案不在目標裝置肯打開的那一族裡,就足以解釋「根本不開」,哪怕裡面的畫面完全沒問題。
- 標籤這一層。容器對、畫面是 HEVC 卻讀不出設定,先按第 3 節把標籤重寫一遍——這是複製,不是重壓。
- 聲音這一層。列出每一條音軌,不只第一條;決定哪一門語言該排在前面,是有意的選擇,不是碰運氣。
- 字幕這一層。文字能搬,圖片只能認讀或放棄。
- 最後才考慮重壓畫面。標籤救不了的那一類才需要重新編碼,那是另一件更慢的活,有它自己的體積邊界。
順序錯了,人就會在同一台裝置上把同一個錯誤做三遍。
8. 這一頁的讀數從哪來,我們做什麼
上面每一條數字都取自同一台機器上的一趟檢查:Apple M2、macOS 27.2,命令列檢查工具 9.0.2。樣本出自我們自有的測試包。B 與 C 由同一段自產畫面複製寫成(源件是一枚兩分鐘長的自有測試檔:HEVC Main 10、1920×1080、yuv420p10le、一條 AAC 聲音軌,讀回 14,956,756 位元組;B 與 C 是把它的畫面原樣複製進兩枚 mp4,只重貼軌道標籤,位元組數見上面那張表);G 到 L 是圍繞光碟時代的聲音與字幕格式搭的測試件。本頁不轉發任何樣本檔案——上面每一族結構,你都能在自己已有的素材上重建出來。
我們做的是一款 iPhone、iPad 與 Mac 上的產品,產物只有一個容器:MP4。沒有位元率、編碼器、解析度這些旋鈕;替你做的決定只有三選一——只換容器、換容器並改寫聲音、把畫面重新編碼。一個本來就能直接播放的檔案不算一次轉換:App 不為它生成第二份檔案,也不計數。付費形態是一次買斷(這項購買在產品裡叫 Opus),它只改變之後還能轉換多少次,這一件事寫在這裡。
- 帶 DRM 保護的內容不被處理,包括從商店租來或買來的影片。
- 從來不是文字的字幕可以被認讀成文字;認讀會出錯,畫面零改動,不會把字燒進畫面。
- 字幕重建時,簡繁之間的區分會遺失。
- 畫面重壓那一路,產物若會比原件大就被攔下,而不是照樣交給你。
- 處理在這台裝置上完成,檔案本身不需要交給別處;Mac 版與 iPhone 版不是同一款介面,我們不假裝它是。
常見問題
將 .mkv 改名為 .mp4 可以嗎?
不行,這一步從來不是捷徑。副檔名只是標籤,改標籤不重寫容器內部的結構,也不改畫面編碼;裝置打開檔案時讀的是裡面的結構,不是檔名。改名之後「能打開」的機率不會變,而你會失去判斷哪一層出問題的機會。
只重寫標籤,檔案會變成另一回事嗎?
不會。上面那對樣本讀回來位元組數完全相同(都是 12,973,400),畫面一格都沒重壓。這也正是這一層的價值:一次複製就能解決的層,不該用一次重新編碼去試。
我的片子有五條音軌,會不會只剩一條?
軌道要逐條判,不是整條檔案一個結論。能帶的按條帶走,帶不動的那一條走重編;真正會造成「只剩一條」的,是工作只盯著第一條音軌的那種做法。多語言片子動手前先數清楚你要的那一門坐在第幾條。
圖片字幕能原樣放進 MP4 嗎?
不能。MP4 的字幕軌道按文字建,圖片那類沒有對應的位置。可行的做法只有兩種:認讀成文字再帶過去(可能有錯,要核對),或者放棄這條字幕。不存在既保留原始圖形、又把它放進文字軌道的第三種做法。
這些讀數能不能在我這台機器上複算?
讀的是檔案內部,任何一台機器上都能複算——你手上那枚檔案裡有什麼,檢查工具列得出來。複算不出來的只有後半段:裝置那一側收不收,只能靠一次真實播放。這一頁給的是判斷順序,不是一張要你相信的表。
Axiom One LLC — CineX