当前位置:首页 > 云服务器 > 正文

如何实现Android本地视频压缩?,有哪些代码示例?

MediaCodec 硬编码压缩方案

Android 自带的 MediaCodec + MediaMuxer 可实现高效率的本地视频压缩,利用 GPU 硬件加速,功耗低、速度快。

  • 核心思路:解码原视频 → 重新编码(降低分辨率、码率等)→ 复用输出。
  • 关键参数:MediaFormat.KEY_BIT_RATE、KEY_FRAME_RATE、KEY_WIDTH/HEIGHT。

示例代码片段(Kotlin)

如何实现Android本地视频压缩?,有哪些代码示例? 第1张

FFmpeg 软编码压缩方案

通过 mobile-ffmpegFFmpegKit 库,调用命令行参数进行压缩,灵活性高,可自定义编解码器。

  • 优点:参数丰富(如 -crf、-preset),支持多种格式。
  • 缺点:纯软件编码,速度较慢,CPU 占用高。

示例代码片段(Kotlin)

如何实现Android本地视频压缩?,有哪些代码示例? 第2张

// 使用 FFmpegKit 执行压缩命令 FFmpegKit.execute("-i $inputPath -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 128k -vf scale=1280:720 $outputPath")

  • -preset:编码速度与压缩率平衡(ultrafast → veryslow)。
  • -crf:质量参数(0-51),越低质量越好,23-28 为佳。

方案对比

特性 MediaCodec 硬编码 FFmpeg 软编码
速度 快(GPU 加速) 慢(CPU 计算)
兼容性 所有 Android 设备 需引入库,体积增大
灵活性 参数有限 几乎全参数可调
功耗

注意事项

  • 硬编码需处理 编码器异步通知,确保正确释放 Surface 和 MediaCodec 实例。
  • 视频压缩建议在子线程中执行,避免阻塞 UI。
  • 使用 WorkManagerForegroundService 管理长时间压缩任务。


相关问题与解答

问题1:如何选择压缩后的视频分辨率与码率,使其在清晰度与体积间取得平衡?

如何实现Android本地视频压缩?,有哪些代码示例? 第3张

解答:

  • 分辨率建议根据原始视频尺寸按比例降低,如 1080p → 720p 或 480p。
  • 码率可参考以下经验值:
    • 720p(30fps):1.5 – 2.5 Mbps
    • 480p(30fps):0.8 – 1.5 Mbps

  • 若使用 FFmpeg,可结合 -crf 参数(如 23-28)自动平衡码率;硬编码时需手动设定 KEY_BIT_RATE。
  • 建议先对一段短视频测试,或在 UI 上提供 “低/中/高” 画质选项,对应不同码率与分辨率组合。

问题2:为什么硬编码压缩后视频出现绿屏或花屏,如何排查?

解答:

  • 常见原因:输入 Surface 尺寸与编码器配置不一致,或 I 帧间隔设置不当
  • 解决方法:
    1. 确保解码器输出的图像尺寸与编码器输入的 KEY_WIDTH/HEIGHT 完全匹配,必要时通过 MediaCodec.BufferInfo 裁剪。
    2. 设置合理的 KEY_I_FRAME_INTERVAL(1-2 秒),避免关键帧缺失导致花屏。
    3. 确认编码器配置的 COLOR_FORMAT 为 COLOR_FormatSurface(用于 Surface 输入)。
    4. 检查编码器输出 buffer 的 offset 与 size 是否正确,写入 muxer 时需为每个 sample 设置正确的 presentationTimeUs。

0