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