在浏览器里做视频压缩,我踩的三个坑
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
我做了个纯客户端的视频压缩工具,整个过程不上传文件。 管线分三条路:文件本来就达标,就直接复制编码样本,一帧都不重编; AVI 直接 -c copy 到 Matroska,产出 1151 字节快速路径要求 mediabunny 能读懂容器。它读不了 AVI,但很多 AVI 里装的是 H.264, ffmpeg -i in.avi -map 0✌️0 -map 0:a? -c copy 这条命令是失败的,而且失败得很直接: [matroska] Timestamps are unset in a packet for stream 0 AVI 不存逐包时间戳,它靠固定帧率加一个索引,让解复用器自己算。
修法是输入侧加一个 flag: ffmpeg -fflags +genpts -i in.avi ...
然后做了个对照组:同样的分辨率、时长、目标,但编码换成 Xvid, H.264 AVI,换容器后走 WebCodecs 7.5 秒 53.3 MB → 12.3 MB 输出体积差不到 2%,墙上时间差 7 倍。这还是无头 Chromium 的软件编码, 另外提一句:ffmpeg.wasm 是把退出码 resolve 出来而不是 reject, 所有 AAC 音轨都会让 mediabunny 的复制路径失效passthrough 这条路本该什么都不动:给 mediabunny 一个空的 video 配置, 视频确实复制了,音频没有。3.3 MB 的源出来变成 3.6 MB,于是我去拆 MP4 的 box: 源 moov 33,948 mdat 3,432,287 moov 反而更小,增长全在 mdat。分轨看: avc1 900 个样本 3,071,520 字节 (和源一字节不差) 视频是精确复制,音频翻了一倍:源 96 kbps,出来约 191 kbps。 原因在 mediabunny 的复制条件里。快速路径要求 video codec: avc firstTimestamp: 0 是负的。而 44100 Hz 下 0.0232 秒正好是 1024 个样本,也就是一个 AAC 帧。 这个在调用侧绕不过去:传 bitrate 想控制体积,本身就会强制转码, 我最后加了个下限:如果 passthrough 产出的字节数不小于输入, 多线程的 ffmpeg core 要拿广告收入去换
而 COEP: require-corp 会打断没有主动 opt-in 的第三方嵌入。 想说的一点两个真 bug,代码审查和单元测试都没抓到。AVI 那个当时测试全绿、 有兴趣可以拿手上难搞的文件试试。被问得最多的两个场景各有单独的页面: 阅读原文:点击这里 该文章在 2026/9/2 11:15:32 编辑过 |
关键字查询
相关文章
正在查询... |