通过阅读本文,您可以了解Android端阿里云播放器SDK集成Native RTS SDK实现超低延时直播的方法。
SDK集成
添加阿里云播放器SDK和Native RTS SDK的依赖文件,有以下两种方式:
阿里云播放器SDK接口使用
调用阿里云播放器SDK接口实现超低延时直播功能。更多阿里云播放器SDK功能,请参见进阶功能和API说明。
以下为示例代码。详细代码请参见开源项目。
基于阿里云播放器实现RTS拉流时,不能调用pause暂停直播流。您可以先调用stop停止播放,再调用prapare重新播放。
不支持seek(拖动)。
加载库
根据实际需求,在适当的Activity内加入
System.loadLibrary("RtsSDK");
。static { System.loadLibrary("RtsSDK"); }
创建播放器
通过AliPlayerFactory类可创建两种播放器:AliPlayer和AliListPlayer。单个播放功能使用AliPlayer,创建方法如下所示:
AliPlayer aliyunVodPlayer; ..... aliyunVodPlayer = AliPlayerFactory.createAliPlayer(getApplicationContext());
设置播放器监听事件
播放器提供了多种监听事件,例如:onPrepared、onCompletion等。设置方法如下所示:
aliyunVodPlayer.setOnErrorListener(new IPlayer.OnErrorListener() { @Override public void onError(ErrorInfo errorInfo) { //出错事件 } }); aliyunVodPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { //准备成功事件 } }); aliyunVodPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(int width, int height) { //视频分辨率变化回调 } }); aliyunVodPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() { @Override public void onRenderingStart() { //首帧渲染显示事件 } }); aliyunVodPlayer.setOnInfoListener(new IPlayer.OnInfoListener() { @Override public void onInfo(int type, long extra) { //其他信息的事件,type包括循环播放开始、缓冲位置、当前播放位置、自动播放开始等 } }); aliyunVodPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() { @Override public void onLoadingBegin() { //缓冲开始 } @Override public void onLoadingProgress(int percent, float kbps) { //缓冲进度 } @Override public void onLoadingEnd() { //缓冲结束 } }); aliyunVodPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() { @Override public void onSubtitleShow(long id, String data) { //显示字幕 } @Override public void onSubtitleHide(long id) { //隐藏字幕 } }); aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() { @Override public void onChangedSuccess(TrackInfo trackInfo) { //切换音视频流或者清晰度成功 } @Override public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) { //切换音视频流或者清晰度失败 } }); aliyunVodPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() { @Override public void onStateChanged(int newState) { //播放器状态改变事件 } }); aliyunVodPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() { @Override public void onSnapShot(Bitmap bm, int with, int height) { //截图事件 } });
创建DataSource
播放器支持4种播放源:VidSts、VidAuth、VidMps和UrlSource。其中UrlSource是直接URL播放,需要将URL设置为
artc://
协议,才可以使用RTS服务。UrlSource urlSource = new UrlSource(); urlSource.setUri("artc://<播流地址>"); aliyunVodPlayer.setDataSource(urlSource);
设置显示的View
如果源有画面,需要设置显示的View(支持SurfaceView和TextureView)到播放器中,用来显示画面。此处以SurfaceView举例说明,如下所示:
surfaceView = (SurfaceView) findViewById(R.id.playview); surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { aliyunVodPlayer.setDisplay(holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { aliyunVodPlayer.surfaceChanged(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { aliyunVodPlayer.setDisplay(null); } });
播放控制
您需要自行创建播放器的控制按钮,在按钮事件里面实现播放器控制接口。基本控制功能有播放、停止,使用示例如下所示:
//准备,在准备完成的回调接口中,调用start()可以开始播放 aliyunVodPlayer.prepare(); //开始播放 aliyunVodPlayer.start(); //停止播放 aliyunVodPlayer.stop(); //重置 aliyunVodPlayer.reset(); //释放(释放后播放器将不可再被使用) aliyunVodPlayer.release();
播放参数配置
配置播放参数,提升超低延时直播效果。
//获取配置 PlayerConfig config = mAliyunVodPlayer.getConfig(); //设置最大延时为1秒,延时控制由ARTC控制 config.mMaxDelayTime = 1000; //设置播放器启播缓存为10毫秒,数据控制由ARTC控制。 config.mHighBufferDuration = 10; config.mStartBufferDuration = 10; ....//其他设置 //给播放器加载配置 mAliyunVodPlayer.setConfig(config);
日志开关
//开启日志 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);
直播降级
直播降级是将前缀为artc://的播放器URL源字符串直接修改为 http-flv 形式,然后更新播放器UrlSource,并开始播放的策略。
/** * 降级策略 */ private void willBeDemoted() { mRtsAliPlayer.stop(); if (mUrl.startsWith("artc://")) { setDataSource("http://xxxx.flv"); mRtsAliPlayer.prepare(); } }
获取TraceId
播放器事件回调收到播放组件中透传输出的消息时,解析播放器事件说明JSON字符串,得到的code是RtsSDK中的message,收到E_HELP_SUPPORT_ID_SUBSCRIBE时,解析字符串中"-sub-"后的字符串得到TraceId。
private static final int TRACE_ID_CODE = 104; //监听播放器 onInfo 回调,并解析 Rts 事件消息 mRtsAliPlayer.setOnInfoListener(infoBean -> { if (infoBean.getCode() == InfoCode.DirectComponentMSG) { String extraMsg = infoBean.getExtraMsg(); parseDirectComponentMSG(extraMsg); } }); private void parseDirectComponentMSG(String msg) { if (msg.contains("code=" + TRACE_ID_CODE)) { parseTraceId(msg); } } /** * 解析 TraceId */ private void parseTraceId(String msg) { String[] split = msg.split("-sub-"); if (split.length >= 1) { mTraceId = "RequestId:" + (split[1].substring(0, split[1].length() - 1)); mTraceId = mTraceId.replace("\"", "").replace("\\", ""); } }