一、引言
因为有些客户对支持720p视频有要求,所以,需要让组件支持720p。对于720p,关键问题一个在于带宽,另外一个在于终端设备CPU的消耗。对于带宽,高分辨自然需要高码率与之对应,对于需要多少码率,也需要测试才能最终确定。对于CPU消耗,720p在编解码时,需要耗费大量CPU,复杂度较高,很容易引起手机等终端发烫。而安卓自4.2之后开始硬件支持视频编解码,主要内容在mediacodec包中。但是很多软件不愿意去用安卓硬编解码,主要原因每个芯片厂商对硬编解码的实现与对外输出的数据都有可能不同,造成适配起来相当费时费力。至于能否使用自然需要测试。
所以本文包括测试如下:
1、720p码率测试
2、硬编解码手机支持适配测试
3、硬编码与软编码对比测试
二、720p码率测试
测试序列:FourPeople_1280x720_60.y4m
测试环境:PC,x264编码器,组件相同配置
测试数据:
1、主观质量打分
注:这里6分表示图像尚为清晰,能够接受。纵列代表码率,横列代表不同的编码级别。
2、客观质量打分
这里测试采用FourPeople_1280x720_60.y4m标准序列,直接采用x264编码,配置则和组件相同配置。
从测试的数据来看,如果要想达到720p该有的清晰度,码率至少要达到800kb,但是现在组件的策略只能达到500kb,后期码率这一块肯定需要做出调整,来适应720p分辨率。
三、硬编解码手机支持适配测试
测试方法:将支持硬编解码的组件分别安装在不同的安卓手机,看是否支持硬编解码以及走的是软编解码还是硬编解码。
测试数据:
可支持硬编解码:
三星S5---------------------硬编解码----------高通
三星note5 n9200-------硬编解码----------三星
三星s6---------------------硬编解码----------三星
华为mate7---------------硬编解码----------海思
HTC d816t -----------------硬编解码----------高通
红米note1s---------------硬编解码----------高通
Vivo x6d--------------------硬编解码----------MTK
三星sm_n9006----------硬编解码----------高通
Coolpad_a8_930---------硬编解码----------高通
Nubia_nx513j-------------硬编解码----------高通
Coolpad_8297------------硬编解码----------高通
Lenovo_x2_to-------------硬编解码----------MTK
HTC_one_m8w------------硬编解码---------高通
LG_h818--------------------硬编解码----------高通
金立f103------------------硬编解码-----------MTK
金立y51a------------------硬编解码-----------高通
Oppo A53m----------------硬编解码-----------高通
软编解码:
红米2A-------------------软编解码------------hantro
三星sch_i939d---------软编解码------------三星
三星sm_g7108v-------软编解码------------高通
小米3 --------------------软编解码------------Nvidia
因为在适配时,只适配了高通,华为海思,联发科以及三星猎户座这四个主流芯片,所以其他芯片手机在组件中一定不走硬编解码,但是即使是这四个芯片也还要看芯片是否支持,以及适配情况。如果支持硬编码,就支持硬解码。现在主流机型都支持硬编解码,只要是这四个芯片,组件应该就支持硬编解码。
测试中发现的问题如下:
1、硬解码在适配方面难度更大,主要表现在:
- 解码过程中变化分辨率,mate7等会大小屏。
- 对于360*480等不是16整数倍的宽高,不同机器的表现不一,一系列适配问题。
- 解码过程中重新设置解码器,会出现问题。
2、硬编码在三星s6上分辨率不是16整数倍如360*480时,编码出来的数据有问题。
基于上述一系列问题,去适配硬解码不现实,难度很大。但是硬编码问题较少,在给编码器设置相同的profile和level后,编码出来的数据较为统一。但是对于不是16整数倍的分辨率,除了三星s6,仍然有潜在风险。所以硬编码第一步,最好只支持16整数倍的分辨率,后面再去找到360*480分辨率的问题点和共同点,来解决问题。
四、硬编码与软编码对比测试
测试机型:金立F013,三星S6,华为mate7,HTC_d816t,LG_h818,Oppo A53m
测试工具:GT
测试时长:10分钟
测试内容:CPU对比测试,手机温度对比测试,通话图像质量主观对比测试
测试数据如下:
1、CPU对比测试
注:这里CPU消耗为平均消耗值。
数据上可以看出,绝大部分机型硬编码在CPU消耗上要好于软编码的,这也是硬编码最大的优势所在。
2、手机温度对比测试
注:空格为用GT没有获取到温度数据。这里的温度为平均温度。
数据上可以看出,硬编码的手机温度要好于软编码的。
3、通话主观质量对比测试
6 特别好
5 好
4 较好
3 一般
2 较差
1 特别差
这里主观评分按照清晰度、流畅度和延时在3个方面分别评分,从而更为全面地评价软硬编码。
机型覆盖支持的四种芯片,从数据和实验中可以看到,在部分机型上面硬编码的流畅度要比软编码要差,通过分析,主要原因在于,采集后的图像没有给到编码器,而是丢弃了,至于引起丢帧的原因有待查明。而同时这部分机型上,清晰度要高于软编码,可能码率控制部分没有起作用,原因有待进一步查明。
而在一些机型上,如华为mate7,Oppo A53m上软硬编码表现较为相似。
总结:
对于软编码和硬编码,总体而言,硬编码在CPU消耗和手机发热方面要好一点,但质量方面差一些,但是这种质量差,是因为webrtc其他部分引起的,硬编码本身不存在问题。如果在码率控制和丢帧处理上做的比较好的话,硬编码有着绝对的优势。
对于720p,也同样是一个较为系统的工程,如果只是把分辨率编码成7201280,较为简单,但视频通话总体质量还是要靠每一个部分共同支持,才能达到比较好的效果。显然,webrtc引擎很多地方对720p的支持不是很好,尤其在于码率动态调整和帧率动态调整方面。还有就是实际网络也比较难以达到跑720p的要求。
对于以后,硬编码建议继续优化,主要在于适配机型方面。适配更多的机型之后,也可以考虑用到我们现有的240320、360480、480640这些分辨率上面。
对于720p,建议后面可以从码率动态调整和帧率动态调整这两个方面去适应720p,或者设置成固定的而不用动态的。
经过优化之后补充测试
优化点:如上述总结所言,经过在码率和帧率方面对720p做出单独处理,不同于其他低分辨率,同时不影响原有低分辨率相关算法。
补充测试:
这里仅补充通话主观质量对比测试,结果如下,
通话主观质量对比测试
6 特别好
5 好
4 较好
3 一般
2 较差
1 特别差
总结:
经过在码率和帧率方面对720p做出单独处理,通话整体质量已经达到较好的效果。但仍存在一些缺陷,主要表现在机器配置较低时,会有卡顿。而且在丢帧这一块尚不完善,需要继续改进。
软编码和硬编码表现基本相当,但手机发热会好一点,CPU占用会小一点,但部分机型可能延时会大一点。
这一切都是基于好的网络和好的组网的前提下,跑高码率,没有组网的支持,实际线上环境会比较卡的。