上一篇
如何实现Android本地视频压缩?,有哪些代码示例?
- 云服务器
- 2026-07-25
- 10
MediaCodec 硬编码压缩方案
Android 自带的 MediaCodec + MediaMuxer 可实现高效率的本地视频压缩,利用 GPU 硬件加速,功耗低、速度快。
- 核心思路:解码原视频 → 重新编码(降低分辨率、码率等)→ 复用输出。
- 关键参数:MediaFormat.KEY_BIT_RATE、KEY_FRAME_RATE、KEY_WIDTH/HEIGHT。
示例代码片段(Kotlin):

FFmpeg 软编码压缩方案
通过 mobile-ffmpeg 或 FFmpegKit 库,调用命令行参数进行压缩,灵活性高,可自定义编解码器。
- 优点:参数丰富(如 -crf、-preset),支持多种格式。
- 缺点:纯软件编码,速度较慢,CPU 占用高。
示例代码片段(Kotlin):

// 使用 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。
- 使用 WorkManager 或 ForegroundService 管理长时间压缩任务。
相关问题与解答
问题1:如何选择压缩后的视频分辨率与码率,使其在清晰度与体积间取得平衡?

解答:
- 分辨率建议根据原始视频尺寸按比例降低,如 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 帧间隔设置不当。
- 解决方法:
- 确保解码器输出的图像尺寸与编码器输入的 KEY_WIDTH/HEIGHT 完全匹配,必要时通过 MediaCodec.BufferInfo 裁剪。
- 设置合理的 KEY_I_FRAME_INTERVAL(1-2 秒),避免关键帧缺失导致花屏。
- 确认编码器配置的 COLOR_FORMAT 为 COLOR_FormatSurface(用于 Surface 输入)。
- 检查编码器输出 buffer 的 offset 与 size 是否正确,写入 muxer 时需为每个 sample 设置正确的 presentationTimeUs。