#问题描述
在 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: FFmpeg 合并视频片段
输入: 多个 H.264 视频片段
处理: 使用 xfade 滤镜添加淡入淡出效果
输出: MPEG4 格式视频 (使用 mpeg4 编码器)
步骤2: MediaCodec 格式转换
输入: MPEG4 视频
处理: 使用 Android MediaCodec 编码器
输出: H.264 格式视频 (期望)#2. 诊断发现
通过添加详细的视频文件诊断功能,发现了问题所在:
#FFmpeg 输出的 MPEG4 文件(正常)
📦 文件大小: 15 MB (16,621,019 bytes)
📊 轨道数量: 2
- 轨道 #0: video/mp4v-es (1920x1080, 30fps, 14 Mbps)
- 轨道 #1: audio/mp4a-latm (44100 Hz, mono, 128 kbps)
⏱ 时长: 9.434 秒
✅ 可以成功解码视频帧#MediaCodec 转换后的 H.264 文件(损坏)
📦 文件大小: 13 MB (14,320,762 bytes)
📊 轨道数量: 0 ❌ 关键问题!
⏱ 时长: 未知
🎥 包含视频: null
🔊 包含音频: null
⚠️ 无法获取视频帧#3. 问题原因
vivo X200 的 MediaCodec H.264 编码器存在 bug:
- MediaCodec 编码器虽然成功生成了 H.264 比特流
- MediaMuxer 写入文件时未正确写入轨道元数据
- 最终文件的轨道数为 0,导致播放器无法识别
从日志可以看到,虽然 Muxer 报告添加了轨道:
✅ 添加H.264视频轨道: {color-standard=1, ...}
✅ 添加音频轨道: {...}
🎬 Muxer已启动
✅ 视频编码完成
✅ 音频流复制完成,共 405 个音频帧但最终文件却没有任何轨道信息,这是 vivo X200 MediaCodec 的已知缺陷。
#解决方案
#方案
直接使用 MPEG4 格式输出,跳过 H.264 转换
#优点
- ✅ 完全避免了有问题的 MediaCodec 编码器
- ✅ MPEG4 文件正常,可以在所有设备上播放
- ✅ 节省转换时间和资源消耗
- ✅ 立即解决问题,无需等待固件更新
#缺点
- ⚠️ 文件稍大(MPEG4 比 H.264 大约 15-20%)
- ⚠️ 某些老旧设备可能对 MPEG4 支持不如 H.264
#诊断工具
为了帮助分析类似问题,添加了详细的视频文件诊断功能:
#使用方法
在代码中调用:
diagnoseVideoFile(videoPath, "视频文件描述");
有问题请留言~
在 GitHub 查看讨论