通过阅读本文,您可以了解Android端阿里云播放器SDK实现超低延时直播的方法。
SDK集成
添加阿里云播放器SDK的依赖文件,示例如下:
Maven集成
添加Maven仓库地址。
在根目录的build.gradle中添加Maven仓库地址。
//阿里云相关SDK(阿里云播放器) Maven仓库地址 maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases' }
在工程的app/build.gradle文件中添加阿里云播放器SDK依赖文件。
def player_sdk_version = "x.x.x" // 建议使用最新版本,详情请参考:https://help.aliyun.com/zh/vod/developer-reference/sdk-overview-and-download?spm=a2c4g.11186623.0.0.29e96cf9Bijvrq#section-v53-2oj-xfd def rts_sdk_version = "7.2.0" // 独立版本号,目前最新版本 // 播放器主库 implementation 'com.aliyun.sdk.android:AliyunPlayer:$player_sdk_version-full' // 播放器与Rts低延时直播组件的桥接层(AlivcArtc),版本号需要与播放器一致,需要和 Rts低延时直播组件 一起集成 implementation 'com.aliyun.sdk.android:AlivcArtc:$player_sdk_version' // Rts低延时直播组件 implementation 'com.aliyun.rts.android:RtsSDK:$rts_sdk_version'
播放器版本请参考SDK下载,建议使用最新版本。播放器版本要求:推荐V7.2.0或以上版本,最低支持V5.4.5.0。
阿里云播放器SDK接口使用
调用阿里云播放器SDK接口实现超低延时直播功能。更多阿里云播放器SDK功能,请参见进阶功能和API说明。
以下为示例代码。详细代码请参见开源项目。
基于阿里云播放器实现RTS拉流时,不能调用pause暂停直播流。您可以先调用stop停止播放,再调用prepare重新播放。
不支持seek(拖动)。
加载RTS库
根据实际需求,在适当的Activity内加入System.loadLibrary("RtsSDK");
。
static {
System.loadLibrary("RtsSDK");
}
创建播放器
创建播放器。
通过
AliPlayerFactory
类创建AliPlayer播放器。播放器提供的播放质量监控(可查看播放器整体播放质量相关数据)、单点追查(可定位到具体的用户或设备,分析其播放行为,快速定位播放异常等问题)及视频播放统计功能都依赖埋点日志上报功能而实现。
在创建播放器时,根据
setTraceId
参数的设置不同,其后续可实现的功能不同,具体如下:setTraceId
参数不传(默认):埋点日志上报功能开启,后续可以使用播放质量监控和视频播放统计功能,但无法使用单点追查功能。setTraceId
参数传入traceid:traceid的值由您自行定义,需为您的用户或用户设备的唯一标识符,例如传入您业务的userid或者IMEI、IDFA等您业务用户的设备ID。传入traceid后,埋点日志上报功能开启,后续可以使用播放质量监控、单点追查和视频播放统计功能。setTraceId
参数设置为DisableAnalytics
:关闭埋点日志上报,后续无法使用播放质量监控、单点追查和视频播放统计功能。
// 创建播放器 AliPlayer aliPlayer = AliPlayerFactory.createAliPlayer(context); // 建议传入traceId aliPlayer.setTraceId("traceId");
设置监听器。
播放器支持设置多个监听器。
OnPreparedListener
必须设置,因为手动播放需要在OnPreparedListener
回调中调用aliPlayer.start()
开始播放。OnErrorListener
、OnCompletionListener
、OnLoadingStatusListener
、OnInfoListener
较为重要,建议您设置。
aliPlayer.setOnErrorListener(new IPlayer.OnErrorListener() { //此回调会在使用播放器的过程中,出现了任何错误,都会回调此接口。 @Override public void onError(ErrorInfo errorInfo) { ErrorCode errorCode = errorInfo.getCode(); //错误码。 String errorMsg = errorInfo.getMsg(); //错误描述。 //errorExtra为额外错误信息,形式为json字符串,示例如下,需要注意ModuleCode并不完全等同于errorCode //{ "Url": "xxx", // "Module": "NetWork", // "ModuleCode": "-377", // "ModuleMessage": "Redirect to a url that is not a media"} String errorExtra= errorInfo.getExtra(); //出错后需要停止掉播放器。 aliPlayer.stop(); } }); aliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { // 调用aliPlayer.prepare()方法后,播放器开始读取并解析数据。成功后,会回调此接口。 @Override public void onPrepared() { //一般调用start开始播放视频。 aliPlayer.start(); } }); aliPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() { //播放完成之后,就会回调到此接口。 @Override public void onCompletion() { //一般调用stop停止播放视频。 aliPlayer.stop(); } }); aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() { //播放器中的一些信息,包括:当前进度、缓存位置等等。 @Override public void onInfo(InfoBean infoBean) { InfoCode code = infoBean.getCode(); //信息码。 String msg = infoBean.getExtraMsg();//信息内容。 long value = infoBean.getExtraValue(); //信息值。 //当前进度:InfoCode.CurrentPosition //当前缓存位置:InfoCode.BufferedPosition } }); aliPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() { //播放器的加载状态, 网络不佳时,用于展示加载画面。 @Override public void onLoadingBegin() { //开始加载。画面和声音不足以播放。 //一般在此处显示圆形加载。 } @Override public void onLoadingProgress(int percent, float netSpeed) { //加载进度。百分比和网速。 } @Override public void onLoadingEnd() { //结束加载。画面和声音可以播放。 //一般在此处隐藏圆形加载。 } });
创建DataSource。
播放器支持4种播放源:VidSts、VidAuth、VidMps和UrlSource。其中UrlSource是直接URL播放,需要将URL设置为
artc://
协议,才可以使用RTS服务。UrlSource urlSource = new UrlSource(); urlSource.setUri("artc://<播流地址>"); aliyunVodPlayer.setDataSource(urlSource);
设置显示View。
播放器支持SurfaceView和TextureView,任选其中一种即可。
设置SurfaceView,示例如下:
SurfaceView surfaceView = findViewById(R.id.surface_view); surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { aliPlayer.setSurface(holder.getSurface()); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { aliPlayer.surfaceChanged(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { aliPlayer.setSurface(null); } });
设置TextureView,示例如下:
TextureView textureView = findViewById(R.id.texture_view); textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { aliPlayer.setSurface(new Surface(surface)); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { aliPlayer.surfaceChanged(); } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { aliPlayer.setSurface(null); return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } });
播放参数配置
配置播放参数,提升超低延时直播效果。
6.3.0版本以及之后的播放器SDK均支持自动低延时最佳配置,当播放url为“artc://”开头,且客户没有手工修改过
PlayerConfig
的mMaxDelayTime
、mHighBufferDuration
、mStartBufferDuration
值时,SDK会自动分别使用1000、10、10值进行实际的播放。若想自定义控制,请参考如下示例:
//1. 获取并修改配置 PlayerConfig config = mAliyunPlayer.getConfig(); if (playUrl.startWith("artc://")) { //最大延时为1000毫秒 config.mMaxDelayTime = 1000; //起播缓存时长,10毫秒 config.mStartBufferDuration = 10; //卡顿恢复缓存时长,10毫秒 config.mHighBufferDuration = 10; } else { //config使用默认配置或自定义为其他配置 } //2. 应用配置 mAliyunPlayer.setConfig(config);
可选:开启自动播放,默认为关闭状态。
aliPlayer.setAutoPlay(true);
准备播放。
调用
aliPlayer.prepare()
开始读取并解析数据。aliPlayer.prepare();
开始播放。
如果未开启自动播放,需要在
OnPrepard
回调发生之后,择机调用aliPlayer.start()
开始播放视频。如果开启了自动播放,则不需要调用
aliPlayer.start()
,数据解析完成后将开始自动播放视频。
aliPlayer.start();// 开始之后可以调用pause()暂停播放视频。
控制播放
Android播放器SDK支持从指定时间点播放、开始、暂停、停止播放等操作。
开始播放。
指开始播放视频,由
start
接口实现。示例如下:aliyunVodPlayer.start();
停止播放。
指停止播放视频,由
stop
接口实现。示例如下:aliyunVodPlayer.stop();
销毁播放器。
销毁播放器实例,有同步和异步两种销毁方式,示例如下:
//同步销毁,内部会自动调用stop接口 aliyunVodPlayer.release(); //异步销毁,内部会自动调用stop接口 aliyunVodPlayer.releaseAsync();
调用同步销毁接口需等待播放器资源完全释放后才返回。如果您对界面的响应速度有较高要求,建议使用异步销毁接口,并注意以下几点:
避免在异步销毁过程中对播放器对象执行任何其他操作。
无需在调用异步销毁之前手动停止播放器,因为该过程内部已经包含了异步化的停止流程。
辅助功能
日志开关。
//开启日志 Logger.getInstance(context).enableConsoleLog(true); Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_TRACE); //关闭日志 Logger.getInstance(context).enableConsoleLog(false); Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_NONE);
直播RTS降级。
RTS自动降级
在使用超低延时直播RTS地址播放的场景下,当不设置RTS降级地址且RTS拉流失败时,会自动降级到RTS对应的默认FLV地址进行播放。示例如下:
// 1表示开启,0表示关闭。默认开启 AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.ALLOW_RTS_DEGRADE, 1);
RTS自定义降级
在使用超低延时直播RTS地址播放的场景下,通过设置RTS的降级地址(如HLS地址或FLV地址),当RTS拉流失败时,会自动降级到该地址播放。示例如下:
PlayerConfig config = player.getConfig(); //可选,配置config其他项 UrlSource urlSource = new UrlSource(); urlSource.setUri(downgradeUrl); //设置降级URL player.enableDowngrade(urlSource, config);
获取TraceID。
每一次低延时播放都会有一个traceId,可用于问题排查,可以通过播放器事件回调拿到traceid
//监听播放器 onInfo 回调,并解析 DemuxerTraceID 消息 mRtsAliPlayer.setOnInfoListener(infoBean -> { if (infoBean.getCode() == InfoCode.DemuxerTraceID) { String traceId = infoBean.getExtraMsg(); });
- 本页导读 (1)
- SDK集成
- 阿里云播放器SDK接口使用
- 加载RTS库
- 创建播放器
- 控制播放
- 辅助功能