同一个视频,电脑能播、手机放不出来:逐层核对清单(每一层都带实测读数)
电脑放得开、手机放不开,原因通常不在画质,也不在文件坏没坏。拦住它的通常不出四层:容器、画面、声音、字幕;哪一层不对,看到的常常都是同一个结果——"打不开"。所以正确的第一步不是换一个工具再压一遍,而是读文件,判断是哪一层拦住了你。
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. 这一页的读数从哪来,我们做什么
上面每一条读数都取自同一趟检查,样本全部是我们自制的文件。B 与 C 装的是同一段画面:复制进两枚 mp4 时一帧都没重压,只重贴了轨道标签,所以两枚的字节数完全相同(见上面那张表);G 到 L 围绕光盘时代的声音与字幕格式。本页不转发任何样本文件——上面每一族结构,你都能在自己已有的素材上重建出来。
我们做的是一款 iPhone、iPad 与 Mac 上的产品,产物只有一个容器:MP4。没有码率、编码器、分辨率这些旋钮;替你做的决定只有三选一——只换容器、换容器并改写声音、把画面重新编码。一个本来就能直接播放的文件不算一次转换:App 不为它生成第二份文件,也不计数。付费形态是一次买断(这项购买在产品里叫 Opus),它只改变之后还能转换多少次,这一件事写在这里。
- 带 DRM 保护的内容不被处理,包括从商店租来或买来的影片。
- 从来不是文字的字幕可以被认读成文字;认读会出错,画面零改动,不烧字进画面。
- 字幕重建时,简繁之间的区分会丢失。
- 画面重压那一路,产物若会比原件大就被拦下,而不是照样交给你。
- 处理在这台设备上完成,文件本身不需要交给别处;Mac 版与 iPhone 版不是同一款界面,我们不假装它是。
常见问题
把 .mkv 改名成 .mp4 行不行?
不行,这一步从来不是捷径。后缀只是标签,改标签不重写容器内部的结构,也不改画面编码;设备打开文件时读的是里面的结构,不是文件名。改名之后"能打开"的概率不会变,而你会失去判断哪一层出问题的机会。
只重写标签,文件会变成另一回事吗?
不会。上面那对样本读回来字节数完全相同(都是 12,973,400),画面一帧都没重压。这也正是这一层的价值:一次复制就能解决的层,不该用一次重新编码去试。
我的片子有五条音轨,会不会只剩一条?
轨道要逐条判,不是整条文件一个结论。能带的按条带走,带不动的那一条走重编;真正会造成"只剩一条"的,是工作只盯着第一条音轨的那种做法。多语言片子动手前先数清楚你要的那一门坐在第几条。
图片字幕能原样放进 MP4 吗?
不能。MP4 的字幕轨道按文字建,图片那类没有对应的位置。可行的做法只有两种:认读成文字再带过去(可能有错,要核),或者放弃这条字幕。不存在既保留原来的图片字幕、又把它放进文字轨道的第三种做法。
这些读数能不能在我这台机器上复算?
读的是文件内部,任何一台机器上都能复算——你手上那枚文件里有什么,检查工具列得出来。复算不出来的只有后半段:设备那一侧收不收,只能靠一次真实播放。这一页给的是判断顺序,不是一张要你相信的表。
上海智独教育科技有限公司 — CineX