本文提供Android端播放器SDK基礎功能的使用示例,更多功能說明請參見進階功能、API說明。
創建播放器
本節介紹如何用簡單的方式通過Android端播放器SDK播放視頻,按照播放方式的不同可以分為手動播放和自動播放。
創建播放器。
通過
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(); //錯誤描述。 //出錯后需要停止掉播放器。 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。
Android端播放器SDK支持4種點播播放方式,包括:UrlSource播放、VidAuth播放(視頻點播用戶推薦使用)、VidSts播放、加密播放。
Android端播放器SDK支持2種直播播放方式,UrlSource播放和加密播放。
說明UrlSource是直接通過URL播放,VidSts,VidAuth是通過Vid進行播放。
接入地域Region的設置,請參見點播地域標識。
點播視頻播放
點播UrlSource播放
使用點播UrlSource播放方式播放點播視頻,需要將播放器的setUrl屬性設置為播放地址。播放地址可以是第三方點播地址或阿里云點播服務中的播放地址。
阿里云播放地址可以調用獲取音視頻播放地址接口獲取。建議您集成點播服務端SDK來獲取音視頻播放地址,免去自簽名的麻煩。調用接口獲取音視頻播放地址的示例請參見開發者門戶。
本地視頻請確保有訪問權限,播放地址為將本地視頻文件轉換成URL,例如:
/sdcard/xxx/xxx/xxx.mp4
或content://xxx/xxx/xx.mp4
。UrlSource urlSource = new UrlSource(); urlSource.setUri("播放地址");//播放地址,可以是第三方點播地址,或阿里云點播服務中的播放地址,也可以是本地視頻地址。 aliPlayer.setDataSource(urlSource);
點播VidAuth播放(推薦)
使用VidAuth播放方式播放點播視頻,需要將播放器的vid屬性設置為音視頻ID,將playauth屬性設置為音視頻播放憑證。
音視頻ID可以在音視頻上傳完成后通過控制臺(路徑:媒資庫>音/視頻。)或服務端接口(SearchMedia)獲取。
音視頻播放憑證可以調用獲取音視頻播放憑證接口獲取。建議您集成點播服務端SDK來獲取音視頻播放憑證,免去自簽名的麻煩。調用接口獲取音視頻播放憑證的示例請參見開發者門戶。
推薦視頻點播用戶采用此播放方式。相比STS播放方式,PlayAuth播放方式在易用性和安全性上更有優勢,對比詳情請參見憑證方式與STS方式對比。
VidAuth vidAuth = new VidAuth(); vidAuth.setVid("Vid信息");//視頻ID(VideoId) vidAuth.setPlayAuth("playAuth信息");//播放憑證 vidAuth.setRegion("接入地域");//點播服務的接入地域,默認為cn-shanghai aliPlayer.setDataSource(vidAuth);
點播VidSts播放
使用點播VidSts播放方式播放點播視頻是指用STS臨時憑證而非點播音視頻播放憑證播放。STS臨時Token需要提前獲取,獲取方式請參見使用STS臨時授權方案上傳視頻。
播放時需要將播放器的securityToken屬性設置為STS臨時Token,同時設置為STS臨時Token生成的臨時AK對(accessKeyId和accessKeySecret)。
VidSts vidSts = new VidSts(); vidSts.setVid("Vid信息");//視頻ID(VideoId) vidSts.setAccessKeyId("<yourAccessKeyId>");//鑒權ID vidSts.setAccessKeySecret("<yourAccessKeySecret>");//鑒權密鑰 vidSts.setSecurityToken("<yourSecurityToken>");//安全token vidSts.setRegion("接入地域");//點播服務的接入地域,默認為cn-shanghai aliPlayer.setDataSource(vidSts);
點播加密播放
點播視頻支持HLS標準加密、阿里云私有加密和DRM加密。加密播放請參見如何播放加密視頻。
直播視頻播放
直播UrlSource播放
使用UrlSource播放方式播放直播視頻,需要將播放器的setUrl屬性設置為直播拉流地址。播放地址可以是第三方直播地址或阿里云直播服務中的拉流地址。
阿里云直播拉流地址可以通過直播控制臺的地址生成器生成。詳情請參見直播地址生成器。
UrlSource urlSource = new UrlSource(); urlSource.setUri("播放地址");//播放地址,可以是第三方直播地址,或阿里云直播服務中的拉流地址。 aliPlayer.setDataSource(urlSource);
直播DRM加密播放
直播DRM加密播放請參見播放DRM加密視頻-Web端。
設置顯示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) { } });
可選:開啟自動播放,默認為關閉狀態。
aliPlayer.setAutoPlay(true);
準備播放。
調用
aliPlayer.prepare()
開始讀取并解析數據。aliPlayer.prepare();
開始播放。
如果未開啟自動播放,需要在
OnPrepard
回調中調用aliPlayer.start()
開始播放視頻。如果開啟了自動播放,則不需要調用
aliPlayer.start()
,數據解析完成后將開始自動播放視頻。
aliPlayer.start();//開始之后可以調用pause()暫停播放視頻。
控制播放
Android端播放器SDK支持從指定時間點播放、開始、暫停、停止播放等操作。
開始播放
指開始播放視頻,由start
接口實現。示例如下:
aliyunVodPlayer.start();
從指定時間開始播放
指跳轉到某個時刻進行播放,由seekTo
接口實現。適用于用戶拖拽進度條,或續播等需要從指定時間點開始播放的場景。示例如下:
//posotion為指定的時間,單位:毫秒。
aliyunVodPlayer.seekTo(long position);
暫停播放
指暫停播放視頻,由pause
接口實現。示例如下:
aliyunVodPlayer.pause();
停止播放
指停止播放視頻,由stop
接口實現。示例如下:
aliyunVodPlayer.stop();
設置顯示模式
Android端播放器SDK支持填充、旋轉、鏡像等顯示設置。
填充
支持設置寬高比適應、寬高比填充和拉伸填充這3種畫面填充模式,由setScaleMode
接口實現。示例如下:
//設置寬高比適應(將按照視頻寬高比等比縮小到view內部,不會有畫面變形)
aliyunVodPlayer.setScaleMode(ScaleMode.SCALE_ASPECT_FIT);
//設置寬高比填充(將按照視頻寬高比等比放大,充滿view,不會有畫面變形)
aliyunVodPlayer.setScaleMode(ScaleMode.SCALE_ASPECT_FILL);
//設置拉伸填充(如果視頻寬高比例與view比例不一致,會導致畫面變形)
aliyunVodPlayer.setScaleMode(ScaleMode.SCALE_TO_FILL);
旋轉
指畫面按指定角度旋轉,由setRotateMode
接口實現。設置后還可查詢旋轉角度。示例如下:
//設置畫面順時針旋轉0度
aliyunVodPlayer.setRotateMode(RotateMode.ROTATE_0);
//設置畫面順時針旋轉90度
aliyunVodPlayer.setRotateMode(RotateMode.ROTATE_90);
//設置畫面順時針旋轉180度
aliyunVodPlayer.setRotateMode(RotateMode.ROTATE_180);
//設置畫面順時針旋轉270度
aliyunVodPlayer.setRotateMode(RotateMode.ROTATE_270);
//獲取旋轉角度
aliyunVodPlayer.getRotateMode();
鏡像
指畫面按不同鏡像效果顯示,支持水平鏡像、垂直鏡像和無鏡像,由setMirrorMode
接口實現。示例如下:
//設置無鏡像
aliyunVodPlayer.setMirrorMode(MirrorMode.MIRROR_MODE_NONE);
//設置水平鏡像
aliyunVodPlayer.setMirrorMode(MirrorMode.MIRROR_MODE_HORIZONTAL);
//設置垂直鏡像
aliyunVodPlayer.setMirrorMode(MirrorMode.MIRROR_MODE_VERTICAL);
獲取播放信息
Android端播放器SDK支持獲取當前的播放進度、播放時長和緩沖進度等信息。
獲取當前播放進度
指獲取當前的播放時刻,需要在onInfo回調中獲取,由getExtraValue
接口實現。示例如下:
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentPosition){
//extraValue為當前播放進度,單位為毫秒
long extraValue = infoBean.getExtraValue();
}
}
});
獲取播放時長
指獲取視頻總時長。需要在視頻加載完成以后才可以獲取到,可以在onPrepared事件后獲取。由getDuration
接口實現。示例如下:
long duration = mAliPlayer.getDuration();
獲取緩沖進度
指獲取視頻當前的緩沖進度,需要在onInfo回調中獲取,由getExtraValue
接口實現。示例如下:
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.BufferedPosition){
////extraValue為當前緩沖進度,單位為毫秒
long extraValue = infoBean.getExtraValue();
}
}
});
獲取實時渲染幀率、音視頻碼率、網絡下行碼率
示例如下:
//獲取當前渲染的幀率,數據類型為Float。
mAliPlayer.getOption(IPlayer.Option.RenderFPS);
//獲取當前播放的視頻碼率,數據類型為Float,單位為bps。
mAliPlayer.getOption(IPlayer.Option.VideoBitrate);
//獲取當前播放的音頻碼率,數據類型為Float,單位為bps。
mAliPlayer.getOption(IPlayer.Option.AudioBitrate);
//獲取當前的網絡下行碼率,數據類型為Float,單位為bps。
mAliPlayer.getOption(IPlayer.Option.DownloadBitrate);
監聽播放狀態
指監聽播放器的狀態,onStateChanged回調參數為當前播放器狀態。示例如下:
mAliPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
@Override
public void onStateChanged(int newState) {
/*
int idle = 0;
int initalized = 1;
int prepared = 2;
int started = 3;
int paused = 4;
int stopped = 5;
int completion = 6;
int error = 7;
*/
}
});
設置音量
設置音量包括音量調節和靜音設置。
音量調節
指調節音量大小,支持0~2倍,當音量大于1時,可能出現噪音,不推薦使用。由setVolume
接口實現。設置后還可獲取音量信息。示例如下:
//volume的值為0~2之間的實數。
aliyunVodPlayer.setVolume(1f);
//獲取音量信息。
aliyunVodPlayer.getVolume();
靜音設置
指將播放中的視頻設置為靜音狀態,由setMute
接口實現。示例如下:
aliyunVodPlayer.setMute(true);
倍速播放
Android端播放器SDK提供了倍速播放視頻的功能,通過設置setSpeed
方法,能夠以0.5倍~5倍速去播放視頻。同時保持變聲不變調。示例如下:
//設置倍速播放:支持0.5~5倍速的播放,通常按0.5的倍數來設置,例如0.5倍、1倍、1.5倍等
aliyunVodPlayer.setSpeed(1.0f);
多清晰度設置
如果使用VID方式(VidAuth及VidSts)播放,無需額外設置。Android端播放器SDK會從點播服務獲取清晰度列表。Android端播放器SDK支持獲取和切換清晰度,UrlSource方式暫不支持此設置。
獲取清晰度
當視頻加載完成后,可以獲取視頻的清晰度。
//獲取媒體所有的流信息
List<TrackInfo> trackInfos = mAliPlayer.getMediaInfo().getTrackInfos();
//遍歷并獲取清晰度
for (TrackInfo trackInfo : trackInfos) {
if(trackInfo.getType() == TrackInfo.Type.TYPE_VOD){
//獲取視頻清晰度
String vodDefinition = trackInfo.getVodDefinition();
}
}
切換清晰度
通過selectTrack
方法切換清晰度,傳遞對應TrackInfo的index即可。
mAliPlayer.selectTrack(index);
清晰度切換通知
清晰度切換成功與失敗回調。
mAliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
@Override
public void onChangedSuccess(TrackInfo trackInfo) { }
@Override
public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) { }
});
循環播放
Android端播放器SDK提供了循環播放視頻的功能。調用setLoop
開啟循環播放,播放完成后,將會自動從頭開始播放視頻。示例如下:
aliyunVodPlayer.setLoop(true);
同時循環開始的回調將會使用onInfo
中通知。示例如下:
aliyunVodPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.LoopingStart){
//循環播放開始事件。
}
}
});