问题描述
在 vivo X200 设备上,使用淡入淡出效果导出视频时,输出的视频文件出现乱码的问题。
受影响设备
- 机型: vivo X200
- 芯片: 联发科天玑系列
- Android 版本: Android 15
问题现象
- 导出的视频文件有大小(约 13-14 MB)
- 但播放时出现乱码或完全无法播放
- 视频播放器无法识别视频格式
问题根源分析
- 这个问题要么出在视频源上,要么出在转化过程上
- 将 vivo X200 生产的视频a, 在xiaomi 13上导出无乱码问题,将小米13 生产的视频b 传到vivo X200 导出依然存在乱码问题,那么说明在导出过程上。
- 淡入淡出效果的导出主逻辑是 1)生成若干个小片段 2) 在小片段的基础上添加淡入淡出的逻辑 所以先测试了下生成小片段的生成, 小片段没有乱码问题,那么问题应该在 2)
- 2)的内容主要包含两个部分 FFmpeg 合并视频片段 以及 MediaCodec 格式转换 。经验证 FFmpeg 合并视频片段 是没问题的, 那么问题就在MediaCodec 格式转换 上
- 定位好问题的位置,deepseek了一下MediaCodec属于底层组件,这也是为什么xiaomi 没有问题 而 vivo 有问题的原因,绕过这个MediaCodec 就好了。
1. 视频导出流程
应用的视频导出包含两个主要步骤:
1 | 步骤1: FFmpeg 合并视频片段 |
2. 诊断发现
通过添加详细的视频文件诊断功能,发现了问题所在:
FFmpeg 输出的 MPEG4 文件(正常)
1 | 📦 文件大小: 15 MB (16,621,019 bytes) |
MediaCodec 转换后的 H.264 文件(损坏)
1 | 📦 文件大小: 13 MB (14,320,762 bytes) |
3. 问题原因
vivo X200 的 MediaCodec H.264 编码器存在 bug:
- MediaCodec 编码器虽然成功生成了 H.264 比特流
- MediaMuxer 写入文件时未正确写入轨道元数据
- 最终文件的轨道数为 0,导致播放器无法识别
从日志可以看到,虽然 Muxer 报告添加了轨道:
1 | ✅ 添加H.264视频轨道: {color-standard=1, ...} |
但最终文件却没有任何轨道信息,这是 vivo X200 MediaCodec 的已知缺陷。
解决方案
方案
直接使用 MPEG4 格式输出,跳过 H.264 转换
优点
- ✅ 完全避免了有问题的 MediaCodec 编码器
- ✅ MPEG4 文件正常,可以在所有设备上播放
- ✅ 节省转换时间和资源消耗
- ✅ 立即解决问题,无需等待固件更新
缺点
- ⚠️ 文件稍大(MPEG4 比 H.264 大约 15-20%)
- ⚠️ 某些老旧设备可能对 MPEG4 支持不如 H.264
诊断工具
为了帮助分析类似问题,添加了详细的视频文件诊断功能:
使用方法
在代码中调用:
1 | diagnoseVideoFile(videoPath, "视频文件描述"); |