合并不是转码。两条轨道本身已经是压缩好的,合并只是把它们按字节复制进一个新的 MP4 容器:不重新渲染任何一帧,不重采样任何一段音频,工作量小到浏览器就能完成。
为什么两条轨道是分开的
如果每一档画质都要单独封装成一个完整文件,同一段音轨就要被重复存储很多遍。改为分别提供纯视频与纯音频,平台就能按观看者需要临时组合,而下载工具看到的正是这种拆分。
- 纯视频轨道只含画面,完全不含声音
- 纯音频轨道通常是 AAC,封装在兼容 M4A 的容器里
- 视频列表里标着 1080p 的那一条,本身并不是一个完整视频
合并具体做了什么
它把两条轨道复制进同一个 MP4,并重写索引,让播放器可以拖动进度。因为不解码,即使是很长的视频合并也很快,而且完全不损失画质:画面和声音与平台给出的逐字节一致。
合并需要桌面浏览器
合并是把数据边写边存到磁盘,而不是先读进内存,这正是 File System Access API 提供的能力。桌面上的 Chrome、Edge、Opera 支持它;Safari、iOS 以及大多数 Android 浏览器不支持。
- 桌面 Chrome、Edge、Opera:各选一条,一次合并完成
- iPhone、iPad 与 Android:逐条保存,之后再在电脑上合并
- 源站本来就返回单文件的,任何设备都不需要合并
什么时候合并会被拒绝
SniffVid 从不转码,所以只有两种编码本来就装得进 MP4 容器时,合并才可能成功。容器装不下的格式会被直接拒绝,并明确告诉你是哪种编码,而不是悄悄转码。
- H.264(AVC)视频配 AAC 音频可以稳定合并
- VP9、AV1、HEVC 视频可能被拒绝,而不是被转换
- 拒绝信息会写出编码名,方便区分「编码限制」和「网络问题」
速查表
这些表格全站共用,所以你在别处看到的数字,在这里看到的是同一个。
| 当平台… | 结果面板显示 | 你该做什么 |
|---|---|---|
| 直接给一个完整文件 | 一条轨道,画面和声音已经在里面 | 直接保存,任何设备都不需要合并。 |
| 把画面和声音分开 | 两个列表:纯视频轨道与纯音频轨道 | 两个列表各选一条,再用桌面浏览器合并。 |
| 禁止浏览器直连 | 同样的轨道,经由一条短期中转链接送出 | 你什么都不用做:SniffVid 会自己切到中转。 |
背景与边界情况
平台为什么要这么做
如果每一档画质都要单独封装成一个完整文件,同一段音轨就得按画质重复存储很多遍。把画面和声音拆开,服务方就能在观看者要的那一刻临时组合 —— 存储更省,分发也更省。
- 这种拆分是一种分发方式的选择,并不意味着内容受保护
- 有的平台在低画质给一个完整文件,在更高画质才拆成两条流
- 下载工具看到的是和播放器一样的菜单,只是它不会替你组合
合并后的文件到底是什么
MP4 是一个带索引和若干轨道的容器。合并就是把两种编码写进同一个容器,并重建索引让播放器可以拖动进度。两条流都没有被碰过,所以即使视频很长也很快,画质也与源站一致。
- 输出文件里的画面和声音,与平台给出的逐字节一致
- 只有容器和它的索引是新的
- 如果播放器无法拖动进度,那是保存被中断,而不是合并有损
手上只有手机怎么办
把两条轨道都保存下来,之后再在电脑上合并;或者干脆挑一个返回完整文件的平台,直接保存它。两个保存下来的轨道文件并不能替代一个合并文件 —— 播放器只会播其中一个,不会两个一起播。
- 把两个文件放在一起并且把名字取清楚:它们是一对
- 用 ffmpeg 之类的本地工具以 stream copy 方式合并,同样不需要重新编码
- 之后在桌面上重新解析一次链接,让 SniffVid 一次把合并做完,会更省事