This page looks best with JavaScript enabled

Android 上 FFMpeg 和 MediaCodec 视频解码效率对比

 ·  ☕ 2 min read

视频编码格式为: H264, 封装格式为: mp4

外部参考:

能耗对比:

解码1080P 编码1080P

左边是硬件Codec的CPU占用、内存、能耗;右边是软件Codec的

说明:

  • 内存: Codec 过程中, 通过 profiler 观察到的内存占用情况
  • CPU: Codec 过程中,通过 profiler 观察到的处理器使用率

解码

参与测试手机

手机 Android 系统版本 CPU/GPU 发布时间
Xiaomi MI 4LTE 6 高通骁龙801 MSM8X74AC 2014/7
Vivo X9 7.1.2 高通 骁龙625/Adreno (TM) 506 2016/11
Vivo X9 Plus 8.1.0 高通 骁龙653/Adreno510 2016/11
Vivo X30 9.0 三星 Exynos 980 2019/12
Mi Note3 9 高通 骁龙660 2017/9
SM S8 Plus(samsung SM-G955F) 9.0 三星 Exynos 8895/Adreno (TM) 540 2017/5
HUAWEI BKL-AL20 10 HiSilicon Kirin 970(麒麟970) 2017/11
Google Pixel 2 10 高通 骁龙835 2017/10
HUAWEI meta20pro 10 麒麟 980 2018/10

参与测试视频

长度均为 10 秒

文件 FPS 比特率
360_10s_1MB.mp4 30 792 640 360
360_10s_2MB.mp4 30 1656 640 360
360_10s_5MB.mp4 30 4183 640 360
360_10s_10MB.mp4 30 8375 640 360
360_10s_20MB.mp4 30 16996 640 360
360_10s_30MB.mp4 30 25604 640 360
720_10s_1MB.mp4 30 775 1280 360
720_10s_2MB.mp4 30 1582 1280 720
720_10s_5MB.mp4 30 3999 1280 720
720_10s_10MB.mp4 30 8175 1280 720
720_10s_20MB.mp4 30 16372 1280 720
720_10s_30MB.mp4 30 25657 1280 720
1080_10s_1MB.mp4 30 815 1920 1080
1080_10s_2MB.mp4 30 1569 1920 1080
1080_10s_5MB.mp4 30 3948 1920 1080
1080_10s_10MB.mp4 30 7986 1920 1080
1080_10s_20MB.mp4 30 16183 1920 1080
1080_10s_30MB.mp4 30 24563 1920 1080

测试结果

说明:

  • 耗时: 解码过程中,前后两帧解码成功的时间差,不包括解码之后的像素格式转换等操作(解出来都是 YUV420P 的格式)

总结

  • mediacodec 解码上对内存和CPU的消耗都明显低于 ffmpeg(ffmpeg 内存的消耗主要在 native 内存)
  • 随着视频分辨率的增加, ffmpeg 的解码效率降低较快, mediacodec 则相对较慢
  • 在 1080P 上, ffmpeg 的解码效率在大部分手机上已经低于了 30FPS 的要求
  • MediaCodec 由于依赖手机厂家的实现, 可能存在某些分辨率硬解不支持的情况
    • MediaCodec 本质 Android SDK 是向开发者提供的一套通用编解码接口,底层的硬件 Codec 实现需要由具体的厂家做,如果厂家没做自己的硬件编解码实现, 谷歌也提供了支持上限 1080P 的软件 Codec 实现(Android 10时)
  • 虽然从统计中部分 ffmpeg 耗时小于 MediaCodec,但是如果在手机处理器较忙碌的情况下, ffmpeg CPU 使用率较高的问题就会被放大,导致耗时增加
  • 某些手机的 MediaCodec 不支持 mov 格式的封装
  • 编码上: FFMpeg 的灵活性较高;MediaCodec 的编码参数则最好按照谷歌描述的标准设置; 某些机型 MediaCodec 不支持 4K 视频编解码(这些机型本身录像也不支持 4K 录像)

Yang
WRITTEN BY
Yang
Developer