基礎(chǔ)功能
本文提供Flutter框架播放器SDK基礎(chǔ)功能的使用示例,更多功能使用說明請參見進(jìn)階功能、API說明。
創(chuàng)建播放器
本節(jié)介紹如何用更簡單的方式讓Flutter框架播放器SDK播放視頻,按照播放方式的不同可以分為手動播放和自動播放。
如需播放ARTC流,除了需要在集成時(shí)引入RTS相關(guān)依賴,Android端還需在創(chuàng)建播放器前調(diào)用FlutterAliPlayerFactory.loadRtsLibrary();
加載RtsSDK動態(tài)庫。
創(chuàng)建播放器。
創(chuàng)建單實(shí)例播放器。
//創(chuàng)建播放器實(shí)例 FlutterAliplayer fAliplayer = FlutterAliPlayerFactory.createAliPlayer(); //建議傳入TraceID fAliplayer.setTraceID("traceID");
創(chuàng)建多實(shí)例播放器。
需要在Flutter層管理playerId,在播放器的回調(diào)中會返回對應(yīng)的playerId,用來通知Flutter層。
FlutterAliplayer fAliplayer = FlutterAliPlayerFactory.createAliPlayer(playerId: playerId);
設(shè)置監(jiān)聽器。
播放器支持設(shè)置多個(gè)監(jiān)聽器。
創(chuàng)建手動播放時(shí),
OnPrepard
必須設(shè)置,因?yàn)槭謩硬シ判枰?span data-tag="ph" id="codeph-u1w-c9z-unh" class="ph">OnPrepard
回調(diào)中調(diào)用play
開始播放。OnTrackReady
、OnError
較為重要,建議您設(shè)置。
以下示例僅展示部分接口,如下所示:
// 準(zhǔn)備成功 fAliplayer.setOnPrepard((playerId) {}); // 首幀顯示 fAliplayer.setOnRenderingStart((playerId) {}); // 視頻寬高變化 fAliplayer.setOnVideoSizeChanged((width, height,playerId) {}); // 播放器狀態(tài)變化 fAliplayer.setOnStateChanged((newState,playerId) {}); // 加載狀態(tài) fAliplayer.setOnLoadingStatusListener( loadingBegin: (playerId) {}, loadingProgress: (percent, netSpeed,playerId) {}, loadingEnd: (playerId) {}); // 拖動完成 fAliplayer.setOnSeekComplete((playerId) {}); // 播放器事件信息回調(diào),包括buffer、當(dāng)前播放進(jìn)度等等信息,根據(jù)infoCode來判斷,對應(yīng)FlutterAvpdef.infoCode fAliplayer.setOnInfo((infoCode, extraValue, extraMsg,playerId) {}); // 播放完成 fAliplayer.setOnCompletion((playerId) {}); // 設(shè)置流準(zhǔn)備完成 fAliplayer.setOnTrackReady((playerId) {}); // 截圖結(jié)果 fAliplayer.setOnSnapShot((path,playerId) {}); // 錯(cuò)誤結(jié)果 fAliplayer.setOnError((errorCode, errorExtra, errorMsg,playerId) {}); // 切換流變化 fAliplayer.setOnTrackChanged((value,playerId) {});
創(chuàng)建播放源。
Flutter播放器SDK支持4種點(diǎn)播播放方式,包括:UrlSource播放、VidAuth播放(視頻點(diǎn)播用戶推薦使用)、VidSts播放、加密播放。
Flutter播放器SDK僅支持1種直播播放方式,為UrlSource播放。
點(diǎn)播視頻播放
點(diǎn)播UrlSource播放
使用點(diǎn)播UrlSource播放方式播放點(diǎn)播視頻,需要將播放器的setUrl屬性設(shè)置為播放地址。播放地址可以是第三方點(diǎn)播地址或阿里云點(diǎn)播服務(wù)中的播放地址。
阿里云播放地址可以調(diào)用GetPlayInfo接口獲取。建議您通過SDK方式來獲取音視頻播放地址,免去自簽名的麻煩。調(diào)用接口獲取音視頻播放地址的示例請參見開發(fā)者門戶。
void onViewPlayerCreated(viewId) async { // 將渲染的View設(shè)置給播放器 fAliplayer.setPlayerView(viewId); // 設(shè)置播放源 switch (_playMode) { // UrlSource播放方式 case ModeType.URL: this.fAliplayer.setUrl("播放地址"); // 必選參數(shù),播放地址,可以是第三方點(diǎn)播地址,或阿里云點(diǎn)播服務(wù)中的播放地址。 break; default: } }
點(diǎn)播VidAuth播放(推薦)
使用VidAuth播放方式播放點(diǎn)播視頻,需要將播放器的vid屬性設(shè)置為音視頻ID,將playauth屬性設(shè)置為音視頻播放憑證。
音視頻ID可以在音視頻上傳完成后通過控制臺(路徑:媒資庫>音/視頻。)或服務(wù)端接口(SearchMedia)獲取。
音視頻播放憑證可以調(diào)用GetVideoPlayAuth接口獲取。建議您通過SDK方式來獲取音視頻播放憑證,免去自簽名的麻煩。調(diào)用接口獲取音視頻播放憑證的示例請參見開發(fā)者門戶。
推薦視頻點(diǎn)播用戶采用此播放方式。相比STS播放方式,PlayAuth播放方式在易用性和安全性上更有優(yōu)勢,對比詳情請參見憑證方式與STS方式對比。
void onViewPlayerCreated(viewId) async { // 將渲染的View設(shè)置給播放器 fAliplayer.setPlayerView(viewId); //請注意 generatePlayerConfig 之前必須調(diào)用 createVidPlayerConfigGenerator()和setPreviewTime() FlutterAliplayer.createVidPlayerConfigGenerator(); FlutterAliplayer.setPreviewTime(0); // 設(shè)置播放源 FlutterAliplayer.generatePlayerConfig().then((value) { fAliplayer.setVidAuth( vid: "Vid信息",// 必選參數(shù),視頻ID(VideoId)。 region: "接入地域",// 必選參數(shù),點(diǎn)播服務(wù)的接入地域,默認(rèn)為cn-shanghai。 playAuth: "<yourPlayAuth>",// 必選參數(shù),播放憑證,需要調(diào)用點(diǎn)播服務(wù)的GetVideoPlayAuth接口生成。 playConfig: value); }); } }
點(diǎn)播VidSts播放
使用點(diǎn)播VidSts播放方式播放點(diǎn)播視頻是指用STS臨時(shí)憑證而非點(diǎn)播音視頻播放憑證播放。STS安全令牌和STS臨時(shí)AK對(AccessKeyId和AccessKeySecret)需要提前獲取,獲取方式請參見使用STS臨時(shí)授權(quán)方案上傳視頻。
void onViewPlayerCreated(viewId) async { // 將渲染的View設(shè)置給播放器 fAliplayer.setPlayerView(viewId); //請注意 generatePlayerConfig 之前必須調(diào)用 createVidPlayerConfigGenerator()和setPreviewTime() FlutterAliplayer.createVidPlayerConfigGenerator(); FlutterAliplayer.setPreviewTime(0); // VidSts播放方式 FlutterAliplayer.generatePlayerConfig().then((value) { fAliplayer.setVidSts( vid: "Vid信息",// 必選參數(shù),視頻ID(VideoId)。 region: "接入地域",// 必選參數(shù),點(diǎn)播服務(wù)的接入地域,默認(rèn)為cn-shanghai。 accessKeyId: "<yourAccessKeyId>",// 必選參數(shù),STS臨時(shí)AK對的訪問密鑰ID,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 accessKeySecret: "<yourAccessKeySecret>",// 必選參數(shù),STS臨時(shí)AK對的訪問密鑰,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 securityToken: "<yourSecurityToken>",// 必選參數(shù),STS安全令牌,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 playConfig: value); }); }
點(diǎn)播加密播放
點(diǎn)播視頻支持HLS標(biāo)準(zhǔn)加密、阿里云私有加密和DRM加密。加密播放請參見如何播放加密視頻。
直播視頻UrlSource播放
使用UrlSource播放方式播放直播視頻,需要將播放器的setUrl屬性設(shè)置為直播拉流地址。播放地址可以是第三方直播地址或阿里云直播服務(wù)中的拉流地址。
阿里云直播拉流地址可以通過直播控制臺的地址生成器生成。詳情請參見阿里云直播地址生成器 。
void onViewPlayerCreated(viewId) async { // 將渲染的View設(shè)置給播放器 fAliplayer.setPlayerView(viewId); // 設(shè)置播放源 switch (_playMode) { // UrlSource播放方式 case ModeType.URL: this.fAliplayer.setUrl("填寫資源的播放地址"); // 播放地址可以是第三方直播地址,或阿里云直播服務(wù)中的拉流地址。 break; default: } }
設(shè)置顯示View。
如果播放源有畫面,那么需要設(shè)置顯示的view到播放器中,用來顯示畫面。示例如下:
@override Widget build(BuildContext context) { var x = 0.0; var y = 0.0; Orientation orientation = MediaQuery.of(context).orientation; var width = MediaQuery.of(context).size.width; var height; if (orientation == Orientation.portrait) { height = width * 9.0 / 16.0; } else { height = MediaQuery.of(context).size.height; } AliPlayerView aliPlayerView = AliPlayerView( onCreated: onViewPlayerCreated, x: x, y: y, width: width, height: height); return OrientationBuilder( builder: (BuildContext context, Orientation orientation) { return Scaffold( body: Column( children: [ Container( color: Colors.black, child: aliPlayerView, width: width, height: height), ], ), ); }, );
可選:開啟自動播放,默認(rèn)為關(guān)閉狀態(tài)。
fAliplayer.setAutoPlay(true);
準(zhǔn)備播放。
調(diào)用
prepare()
方法準(zhǔn)備播放。fAliplayer.prepare();
開始播放。
如果未開啟自動播放,需要在
OnPrepard
回調(diào)中調(diào)用fAliplayer.play();
開始播放視頻。如果開啟了自動播放,則不需要調(diào)用
fAliplayer.play();
,數(shù)據(jù)解析完成后將開始自動播放視頻。
fAliplayer.play();
控制播放
Flutter框架播放器SDK支持開始、暫停、從指定時(shí)間點(diǎn)播放等主流操作。
開始播放
開始播放視頻,由play
接口實(shí)現(xiàn)。示例如下:
fAliplayer.play();
從指定時(shí)間開始播放
跳轉(zhuǎn)到某個(gè)時(shí)刻進(jìn)行播放,由seek
接口實(shí)現(xiàn)。適用于用戶拖拽進(jìn)度條,或續(xù)播等需要從指定時(shí)間點(diǎn)開始播放的場景。示例如下:
////posotion為指定的時(shí)間,單位:毫秒。seekMode取值:FlutterAvpdef.ACCURATE(精準(zhǔn)seek)和FlutterAvpdef.INACCURATE(非精準(zhǔn)seek)
fAliplayer.seek(position,seekMode);
以指定位置起播,僅生效一次,適用于用戶從指定時(shí)間點(diǎn)開始播放的場景。示例如下:
//以指定位置起播,每次prepare前調(diào)用,僅生效一次,time為指定的時(shí)間(毫秒),seekMode取值:FlutterAvpdef.ACCURATE(精準(zhǔn)seek)和FlutterAvpdef.INACCURATE(非精準(zhǔn)seek)
fAliplayer.setStartTime(time, seekMode);
暫停播放
暫停播放視頻,由pause
接口實(shí)現(xiàn)。示例如下:
fAliplayer.pause();
停止播放
停止播放視頻,由stop
接口實(shí)現(xiàn)。示例如下:
fAliplayer.stop();
銷毀播放器
銷毀播放器實(shí)例,有同步和異步兩種銷毀方式,示例如下:
//同步銷毀,內(nèi)部會自動調(diào)用stop接口
fAliplayer.destroy();
//異步銷毀,內(nèi)部會自動調(diào)用stop接口
fAliplayer.releaseAsync();
設(shè)置顯示模式
Flutter框架播放器SDK支持填充、旋轉(zhuǎn)、鏡像等顯示設(shè)置。
填充
支持設(shè)置寬高比適應(yīng)、寬高比填充和拉伸填充這3種畫面填充模式,由setScalingMode
接口實(shí)現(xiàn)。示例如下:
//設(shè)置寬高比適應(yīng)(將按照視頻寬高比等比縮小到view內(nèi)部,不會有畫面變形)
fAliplayer.setScalingMode(FlutterAvpdef.AVP_SCALINGMODE_SCALEASPECTFIT);
//設(shè)置寬高比填充(將按照視頻寬高比等比放大,充滿view,不會有畫面變形)
fAliplayer.setScalingMode(FlutterAvpdef.AVP_SCALINGMODE_SCALEASPECTFILL);
//設(shè)置拉伸填充(如果視頻寬高比例與view比例不一致,會導(dǎo)致畫面變形)
fAliplayer.setScalingMode(FlutterAvpdef.AVP_SCALINGMODE_SCALETOFILL);
旋轉(zhuǎn)
畫面按指定角度旋轉(zhuǎn),由setRotateMode
接口實(shí)現(xiàn)。設(shè)置后還可查詢旋轉(zhuǎn)角度。示例如下:
//設(shè)置畫面順時(shí)針旋轉(zhuǎn)0度
fAliplayer.setRotateMode(FlutterAvpdef.AVP_ROTATE_0);
//設(shè)置畫面順時(shí)針旋轉(zhuǎn)90度
fAliplayer.setRotateMode(FlutterAvpdef.AVP_ROTATE_90);
//設(shè)置畫面順時(shí)針旋轉(zhuǎn)180度
fAliplayer.setRotateMode(FlutterAvpdef.AVP_ROTATE_180);
//設(shè)置畫面順時(shí)針旋轉(zhuǎn)270度
fAliplayer.setRotateMode(FlutterAvpdef.AVP_ROTATE_270);
//獲取旋轉(zhuǎn)角度
fAliplayer.getRotateMode();
鏡像
支持水平鏡像、垂直鏡像和無鏡像,由setMirrorMode
接口實(shí)現(xiàn)。示例如下:
//設(shè)置無鏡像
fAliplayer.setMirrorMode(FlutterAvpdef.AVP_MIRRORMODE_NONE);
//設(shè)置水平鏡像
fAliplayer.setMirrorMode(FlutterAvpdef.AVP_MIRRORMODE_HORIZONTAL);
//設(shè)置垂直鏡像
fAliplayer.setMirrorMode(FlutterAvpdef.AVP_MIRRORMODE_VERTICAL);
獲取播放信息
Flutter框架播放器SDK支持獲取當(dāng)前的播放進(jìn)度和播放時(shí)長。
獲取當(dāng)前播放進(jìn)度
獲取當(dāng)前的播放時(shí)刻,在onInfo回調(diào)中獲取,單位毫秒。示例如下:
fAliplayer.setOnInfo((infoCode,extraValue,extraMsg,playerId){
if(infoCode==FlutterAvpdef.CURRENTPOSITION){
//extraValue為當(dāng)前播放進(jìn)度
}
});
獲取播放時(shí)長
獲取視頻總時(shí)長。需要在視頻加載完成以后才可以獲取到,可以在AVPEventPrepareDone事件后獲取duration。示例如下:
fAliplayer.getMediaInfo().then((value){
_videoDuration=value['duration'];
});
監(jiān)聽播放狀態(tài)
監(jiān)聽播放器的狀態(tài),onStateChanged 回調(diào)參數(shù)為當(dāng)前播放器狀態(tài)。示例如下:
fAliplayer.setOnStateChanged((newState, playerId) {
//newState為播放狀態(tài)
switch (newState) {
case FlutterAvpdef.AVPStatus_AVPStatusIdle: // 空轉(zhuǎn)、閑時(shí)、靜態(tài)
break;
case FlutterAvpdef.AVPStatus_AVPStatusInitialzed: // 初始化完成
break;
case FlutterAvpdef.AVPStatus_AVPStatusPrepared: // 準(zhǔn)備完成
break;
case FlutterAvpdef.AVPStatus_AVPStatusStarted: // 正在播放
break;
case FlutterAvpdef.AVPStatus_AVPStatusPaused: // 播放暫停
break;
case FlutterAvpdef.AVPStatus_AVPStatusStopped: // 播放停止
break;
case FlutterAvpdef.AVPStatus_AVPStatusCompletion: // 播放完成
break;
case FlutterAvpdef.AVPStatus_AVPStatusError: // 播放錯(cuò)誤
break;
default:
}
});
設(shè)置音量
設(shè)置音量包括音量調(diào)節(jié)和靜音設(shè)置。
音量調(diào)節(jié)
調(diào)節(jié)音量大小,支持0~2倍,當(dāng)音量大于1時(shí),可能出現(xiàn)噪音,不推薦使用。由setVolume
接口實(shí)現(xiàn)。設(shè)置后還可獲取音量信息。示例如下:
//volume的值為0~2之間的實(shí)數(shù)。
fAliPlayer.setVolume(1);
//獲取音量信息。
fAliPlayer.getVolume();
靜音設(shè)置
將播放中的視頻設(shè)置為靜音狀態(tài),由setMute
接口實(shí)現(xiàn)。示例如下:
fAliplayer.setMute(true);
倍速播放
Flutter框架播放器SDK提供了倍速播放視頻的功能,通過設(shè)置setRate
方法,能夠以0.5倍~5倍速去播放視頻。同時(shí)保持變聲不變調(diào)。示例如下:
//設(shè)置倍速播放:支持0.5~5倍速的播放,通常按0.5的倍數(shù)來設(shè)置,例如0.5倍、1倍、1.5倍等
fAliplayer.setRate(1.0);
多清晰度設(shè)置
如果使用VID方式(VidAuth(推薦)及VidSts)播放,無需額外設(shè)置。Flutter框架播放器SDK會從點(diǎn)播服務(wù)獲取清晰度列表。Flutter框架播放器SDK支持獲取和切換清晰度,UrlSource播放方式暫不支持此設(shè)置。
獲取清晰度
當(dāng)視頻加載完成后,可以獲取視頻的清晰度。
fAliplayer.setOnPrepared((playerId) {
fAliplayer.getMediaInfo().then((value){
AVPMediaInfoinfo info=AVPMediaInfo.fromJson(value);
info.tracks.forEach((element){
if(element.trackType==3){
// 清晰度
String definition=element.trackDefinition;
// 流索引
int index=element.trackIndex;
}
});
});
});
切換清晰度
通過selectTrack
方法切換清晰度,傳遞對應(yīng)TrackInfo的index即可。
fAliplayer.selectTrack(trackIdx);
清晰度切換通知
清晰度切換成功回調(diào)。
fAliplayer.setOnTrackChanged((value,playerId){
//有回調(diào)表示切換成功,切換失敗接口暫未提供
});
循環(huán)播放
Flutter框架播放器SDK提供了循環(huán)播放視頻的功能。調(diào)用setLoop
開啟循環(huán)播放,播放完成后,將會自動從頭開始播放視頻。示例如下:
fAliplayer.setLoop(true);
同時(shí)循環(huán)開始的回調(diào)將會使用onInfo
通知。示例如下:
fAliplayer.setOnInfo((infoCode, extraValue, extraMsg, playerId) {
if(infoCode == FlutterAvpdef.LOOPINGSTART){
//循環(huán)播放開始通知
}
});
獲取播放日志
Flutter框架播放器SDK提供了獲取播放日志的功能。調(diào)用enableConsoleLog開啟日志打印。示例如下:
//開啟日志打印功能
FlutterAliplayer.enableConsoleLog(true);
//設(shè)置日志級別,默認(rèn)為AF_LOG_LEVEL_INFO,如需排查問題,可設(shè)置為AF_LOG_LEVEL_TRACE
FlutterAliplayer.setLogLevel(FlutterAvpdef.AF_LOG_LEVEL_INFO);