1 前言
华为公司通过多年的倒退,在网络连接,固网,有线,无线等局部积攒了深厚的教训。无线传输服务就是将这些教训转化为能力体现在手机侧,更好的展示华为手机的劣势。
网络最重要的就是稳固,疾速,低时延。视频App重要的也是保障用户更好的观看体验,对网络的要求也就更高。
本文将以视频播放App为例,介绍根本的利用场景和实现形式,以帮忙用户疾速理解如何应用无线传输服务的相干性能。
2 名词介绍
在上面的介绍中可能会用到一些网络侧罕用的参数,含意如下:
QoE:Quality of Experience,用户体验品质。用户对业务应用的最终感触。在这里次要指体现网络状况的抖动,时延等指标。
WiFi切片:对设施上不同的服务设置不同优先级,并按优先级进行相干数据分组。
3 业务背景介绍
当初各大运营商都开明了针对各种视频软件(如腾讯视频,优酷视频,抖音等)的大流量套餐,因而很多人都会在下班,游览的过程中通过它们观看视频。而观看视频过程中最放心的就是网络不稳固造成的卡顿,分辨率升高等状况,重大影响参观体验。如果手机可能最大限度保障视频的晦涩度,并且及时抉择更优的网络,就可能让用户有更好的参观体验。如果能提前晓得网络的变动,岂不是能更好的应答可能的问题嘛。
4 要害流程
4.1 集成无线传输服务
集成无线传输服务的基本操作能够参考如下文档进行操作:
https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/dev-process-0000001051069902-V5?ha_source=hms1
4.2 如何保障视频品质
视频软件的诉求是什么样的?
首先,网络速度越快越好,速度越快,视频品质越高。
网络要保持稳定,保障继续的观影成果。
当网络状态有稳定时,能够通过缓存性能对网络进行平滑。
当网络不容许时,升高分辨率优先保障连续性。
上面咱们看一下,无线传输服务如何从各个角度晋升视频软件的成果。
4.2.1 网络优选
首先确认一点,无线传输服务并不能对您的网络进行减速。然而它能够在网络状态不稳固,不足以撑持利用要求时,将网络切换到能够满足要求的网络中(如果存在)。
比方用户以后应用WIFI网络,当远离WIFI区域时,网络品质逐步降落。然而如果用户WIFI没有中断,零碎会持续应用该网络,导致视频播放出现异常。
如果能够剖析以后网络状态,并且及时切换到蜂窝网络,则能够更好的进行观影。
无线传输服务提供了基于QoE的网络优选性能。通过被动反馈的形式,向App提供网络状态的回调。App能够通过以后的QoE状态进行相应操作(切换网络,减少缓存等)。
- 注册服务
public class NetworkPredictActivity extends AppCompatActivity { private NetworkQoeClient networkQoeClient; private IQoeService qoeService; private ServiceConnection mSrcConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { qoeService = IQoeService.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { qoeService = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { networkQoeClient = WirelessClient.getNetworkQoeClient(NetworkPredictActivity.this); if (networkQoeClient != null) { networkQoeClient.getNetworkQoeServiceIntent() .addOnSuccessListener(new OnSuccessListener<WirelessResult>() { @Override public void onSuccess(WirelessResult wirelessResult) { Intent intent = wirelessResult.getIntent(); if (intent == null) { return; } NetworkPredictActivity.this.bindService(intent, mSrcConn, Context.BIND_AUTO_CREATE); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { if (e instanceof ApiException) { ApiException ex = (ApiException) e; int errCode = ex.getStatusCode(); } } }); } }}
- 注册回调
注册回调后,零碎会通过callback函数返回网络信息。反馈频率为每秒一次。
public class NetworkQoeActivity extends AppCompatActivity { private int[] channelIndex = new int[4]; private int[] uLRtt = new int[4]; private int[] dLRtt = new int[4]; private int[] uLBandwidth = new int[4]; private int[] dLBandwidth = new int[4]; private int[] uLRate = new int[4]; private int[] dLRate = new int[4]; private int[] netQoeLevel = new int[4]; private int[] uLPkgLossRate = new int[4]; private IQoeService qoeService; private IQoeCallBack callBack = new IQoeCallBack.Stub() { @Override public void callBack(int type, Bundle qoeInfo) throws RemoteException { if (qoeInfo == null || type != 0) { return; } int channelNum = 0; if (qoeInfo.containsKey("channelNum")) { channelNum = qoeInfo.getInt("channelNum"); } String channelQoe = String.valueOf(channelNum); for (int i = 0; i < channelNum; i++) { uLRtt[i] = qoeInfo.getInt("uLRtt" + i); dLRtt[i] = qoeInfo.getInt("dLRtt" + i); uLBandwidth[i] = qoeInfo.getInt("uLBandwidth" + i); dLBandwidth[i] = qoeInfo.getInt("dLBandwidth" + i); uLRate[i] = qoeInfo.getInt("uLRate" + i); dLRate[i] = qoeInfo.getInt("dLRate" + i); netQoeLevel[i] = qoeInfo.getInt("netQoeLevel" + i); uLPkgLossRate[i] = qoeInfo.getInt("uLPkgLossRate" + i); channelIndex[i] = qoeInfo.getInt("channelIndex" + i); channelQoe += "," + channelIndex[i] + "," + uLRtt[i] + "," + dLRtt[i] + "," + uLBandwidth[i] + "," + dLBandwidth[i] + "," + uLRate[i] + "," + dLRate[i] + "," + netQoeLevel[i] + "," + uLPkgLossRate[i]; } } }; @Override protected void onCreate(Bundle savedInstanceState) { if (qoeService != null) { try { int ret = qoeService.registerNetQoeCallBack("com.huawei.hms.wirelessdemo",callBack); } catch (RemoteException ex) { } } }}
- 被动获取状态
App能够被动获取网络状态(须要首先注册回调)。
Bundle qoeInfo = qoeService.queryRealTimeQoe("com.huawei.hms.wirelessdemo"); if (qoeInfo == null) { return; }
- 上报网络状态
当App发现网络状态异样时,能够被动采取升高分辨率的形式,保障视频顺利播放。也能够向无线传输服务上报网络状态,它将剖析以后网络状态,切换到更优的网络中。
data.putInt("eventId", 1); data.putString("netReason", "2"); data.putString("pkgName", "com.huawei.hms.wirelessdemo"); data.putInt("direction", 1); data.putString("version", "5.0.1.300"); long currentTime = System.currentTimeMillis(); String timeNow = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(currentTime); data.putString("errorTime", timeNow); if (qoeService != null) { try { int ret = qoeService.reportAppQuality(data); } catch (RemoteException ex) { } }
4.2.2 网络状态预测
对于视频App来说,一个很大的利用场景就是上下班。在这种状况下,用户的门路雷同,而网络的变化趋势通常也是很相似。针对这种场景,无线传输服务提供了基于学习的预测能力,依据用户的地位变动,被动预知网络变化趋势,以便App提前做出应答(比方晋升视频缓存时长)。
- 注册弱信号接管播送
无线传输服务提供基于播送的弱信号预测。
final IntentFilter filter = new IntentFilter(); filter.addAction(NETWORK_PREDICTION_ACTION); registerReceiver(receiver, filter);
- 接管弱信号播送
receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int enteringTime = intent.getIntExtra("enteringTime", 0); int leavingTime = intent.getIntExtra("leavingTime", 0); int type =intent.getIntExtra("type",0); } };
当Type为1时,在enteringTime后将进入弱信号区间,在进入弱信号区间后,将在leavingTime后来到弱信号区间。
Type为0时示意勾销前一次预测。
信号预测的工夫范畴为30s到60s。
4.2.3 高优先级WIFI发包
当在带宽无限的WIFI环境下,有多个不同App争抢带宽时,有更高优先级的App将能够更好的保障应用成果。
无线传输服务提供了Wifi加强性能,能够保障高优先级上行发包(如果应用华为路由器,可实现上行高优先级)。
- 绑定服务
WifiEnhanceClient wifiEnhanceClient = WirelessClient.getWifiEnhanceClient(WifiEnhanceActivity.this); wifiEnhanceClient.getWifiEnhanceServiceIntent() .addOnSuccessListener(new OnSuccessListener<WirelessResult>() { @Override public void onSuccess(WirelessResult wirelessResult) { Intent intent = wirelessResult.getIntent(); if (intent == null) { return; } WifiEnhanceActivity.this.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception exception) { if (exception instanceof ApiException) { ApiException ex = (ApiException) exception; int errCode = ex.getStatusCode(); } } });
- 设置Wi-Fi高优先级发包
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mWifiEnhanceService != null) { try { mWifiEnhanceService.setHighPriority("com.huawei.hms.wirlesstestdemo", 6, 1); } catch (RemoteException exception) { // 这里能够增加打印 } } }
对视频利用来说上行带宽更加重要,因而该性能在华为WIFI的状况下更加无效。
综合以上三种场景,能够让视频利用在变幻无穷的网络状况下,给用户最好的视频应用感触。
5 其余
无线传输服务中的性能应用到了很多硬件能力,因而局部性能须要有硬件的反对。
欲了解更多详情,请参阅:
华为开发者联盟官网:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/introduction-0000001050749815-V5#ZH-CN_TOPIC_0000001050749815__section10966112614216?ha_source=hms1
参加开发者探讨请到Reddit社区:https://www.reddit.com/r/HuaweiDevelopers/
下载demo和示例代码请到Github:https://github.com/HMS-Core
解决集成问题请到Stack Overflow:https://stackoverflow.com/questions/tagged/huawei-mobile-services?tab=Newest
原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0202442899177200495?fid=18
原作者:胡椒