【安卓】视频App如何使用无线传输服务获得更好的播放体验

视频App如何使用无线传输服务获得更好的播放体验

华为开发者论坛发布于 32 分钟前

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状态进行相应操作(切换网络,增加缓存等)。

【安卓】视频App如何使用无线传输服务获得更好的播放体验

  1. 注册服务

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();

}

}

});

}

}

}

  1. 注册回调

注册回调后,系统会通过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) {

}

}

}

}

  1. 主动获取状态

App可以主动获取网络状态(需要首先注册回调)。

Bundle qoeInfo = qoeService.queryRealTimeQoe("com.huawei.hms.wirelessdemo");

if (qoeInfo == null) {

return;

}

  1. 上报网络状态

当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提前做出应对(比如提升视频缓存时长)。

  1. 注册弱信号接收广播

无线传输服务提供基于广播的弱信号预测。

final IntentFilter filter = new IntentFilter();

filter.addAction(NETWORK_PREDICTION_ACTION);

registerReceiver(receiver, filter);

  1. 接收弱信号广播

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增强功能,可以保障高优先级上行发包(如果使用华为路由器,可实现下行高优先级)。

  1. 绑定服务

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();

}

}

});

  1. 设置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

原作者:胡椒

android

阅读 25发布于 32 分钟前

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议


华为开发者论坛

华为开发者论坛是一个为开发者提供信息传播、开发交流、技术分享的交流空间。开发者可以在此获取技术干...

avatar

华为开发者论坛

华为开发者论坛是一个为开发者提供信息传播、开发交流、技术分享的交流空间。开发者可以在此获取技术干货、华为源码开放、HMS最新活动等信息,欢迎大家来交流分享!

296 声望

24 粉丝

0 条评论

得票时间

avatar

华为开发者论坛

华为开发者论坛是一个为开发者提供信息传播、开发交流、技术分享的交流空间。开发者可以在此获取技术干货、华为源码开放、HMS最新活动等信息,欢迎大家来交流分享!

296 声望

24 粉丝

宣传栏

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状态进行相应操作(切换网络,增加缓存等)。

【安卓】视频App如何使用无线传输服务获得更好的播放体验

  1. 注册服务

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();

}

}

});

}

}

}

  1. 注册回调

注册回调后,系统会通过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) {

}

}

}

}

  1. 主动获取状态

App可以主动获取网络状态(需要首先注册回调)。

Bundle qoeInfo = qoeService.queryRealTimeQoe("com.huawei.hms.wirelessdemo");

if (qoeInfo == null) {

return;

}

  1. 上报网络状态

当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提前做出应对(比如提升视频缓存时长)。

  1. 注册弱信号接收广播

无线传输服务提供基于广播的弱信号预测。

final IntentFilter filter = new IntentFilter();

filter.addAction(NETWORK_PREDICTION_ACTION);

registerReceiver(receiver, filter);

  1. 接收弱信号广播

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增强功能,可以保障高优先级上行发包(如果使用华为路由器,可实现下行高优先级)。

  1. 绑定服务

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();

}

}

});

  1. 设置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

原作者:胡椒

以上是 【安卓】视频App如何使用无线传输服务获得更好的播放体验 的全部内容, 来源链接: utcz.com/a/112890.html

回到顶部