视频编码格式为: 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 录像)