问题描述

在 vivo X200 设备上,使用淡入淡出效果导出视频时,输出的视频文件出现乱码的问题。
Img

受影响设备

  • 机型: vivo X200
  • 芯片: 联发科天玑系列
  • Android 版本: Android 15

问题现象

  • 导出的视频文件有大小(约 13-14 MB)
  • 但播放时出现乱码或完全无法播放
  • 视频播放器无法识别视频格式

问题根源分析

  1. 这个问题要么出在视频源上,要么出在转化过程上
  2. 将 vivo X200 生产的视频a, 在xiaomi 13上导出无乱码问题,将小米13 生产的视频b 传到vivo X200 导出依然存在乱码问题,那么说明在导出过程上。
  3. 淡入淡出效果的导出主逻辑是 1)生成若干个小片段 2) 在小片段的基础上添加淡入淡出的逻辑 所以先测试了下生成小片段的生成, 小片段没有乱码问题,那么问题应该在 2)
  4. 2)的内容主要包含两个部分 FFmpeg 合并视频片段 以及 MediaCodec 格式转换 。经验证 FFmpeg 合并视频片段 是没问题的, 那么问题就在MediaCodec 格式转换 上
  5. 定位好问题的位置,deepseek了一下MediaCodec属于底层组件,这也是为什么xiaomi 没有问题 而 vivo 有问题的原因,绕过这个MediaCodec 就好了。

1. 视频导出流程

应用的视频导出包含两个主要步骤:

1
2
3
4
5
6
7
8
9
步骤1: FFmpeg 合并视频片段
输入: 多个 H.264 视频片段
处理: 使用 xfade 滤镜添加淡入淡出效果
输出: MPEG4 格式视频 (使用 mpeg4 编码器)

步骤2: MediaCodec 格式转换
输入: MPEG4 视频
处理: 使用 Android MediaCodec 编码器
输出: H.264 格式视频 (期望)

2. 诊断发现

通过添加详细的视频文件诊断功能,发现了问题所在:

FFmpeg 输出的 MPEG4 文件(正常)

1
2
3
4
5
6
📦 文件大小: 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 文件(损坏)

1
2
3
4
5
6
📦 文件大小: 13 MB (14,320,762 bytes)
📊 轨道数量: 0 ❌ 关键问题!
⏱ 时长: 未知
🎥 包含视频: null
🔊 包含音频: null
⚠️ 无法获取视频帧

3. 问题原因

vivo X200 的 MediaCodec H.264 编码器存在 bug

  1. MediaCodec 编码器虽然成功生成了 H.264 比特流
  2. MediaMuxer 写入文件时未正确写入轨道元数据
  3. 最终文件的轨道数为 0,导致播放器无法识别

从日志可以看到,虽然 Muxer 报告添加了轨道:

1
2
3
4
5
✅ 添加H.264视频轨道: {color-standard=1, ...}
✅ 添加音频轨道: {...}
🎬 Muxer已启动
✅ 视频编码完成
✅ 音频流复制完成,共 405 个音频帧

但最终文件却没有任何轨道信息,这是 vivo X200 MediaCodec 的已知缺陷。

解决方案

方案

直接使用 MPEG4 格式输出,跳过 H.264 转换

优点

  • ✅ 完全避免了有问题的 MediaCodec 编码器
  • ✅ MPEG4 文件正常,可以在所有设备上播放
  • ✅ 节省转换时间和资源消耗
  • ✅ 立即解决问题,无需等待固件更新

缺点

  • ⚠️ 文件稍大(MPEG4 比 H.264 大约 15-20%)
  • ⚠️ 某些老旧设备可能对 MPEG4 支持不如 H.264

诊断工具

为了帮助分析类似问题,添加了详细的视频文件诊断功能:

使用方法

在代码中调用:

1
diagnoseVideoFile(videoPath, "视频文件描述");