flutter 多视频循环播放(轮播)

用的是flutter_ijkplayer,监听拿到complete状态,reset播放器,更新数据源播放下一个视频,主要做的是安卓,iOS的没有测试过,物理home键切后台,用生命周期状态控制暂停,切前台播放;物理返回键销毁播放器,用状态控制播放器的初始化。图片和视频轮播的切换用的是websocket。

之前用video_player写过视频轮播,但是状态获取和续播控制不好性能。。。flutter用起来ijkplayer还是比原生要方便很多,直接pub一下就行了,不用改任何配置,真香啊

https://github.com/partusorta/flutter-mediaplayer

===========前后台切换的控制

@override

void didChangeAppLifecycleState(AppLifecycleState state) {

if (state == AppLifecycleState.paused) {

if (controller != null && controller.ijkStatus == IjkStatus.playing) {

controller.pause();

}

} else if (state == AppLifecycleState.resumed) {

if (controller != null && controller.ijkStatus == IjkStatus.pause) {

controller.play();

}

}

==========播放控制,先请求数据,再刷新

void getDisplaylist() async {

//播放器下标置0

setState(() {

index = 0;

});

//如果播放器正在播放reset掉

if (controller != null && controller.ijkStatus == IjkStatus.playing) {

controller.reset();

}

//数据请求

var parmas = {'equipmentNo': deviceId};

var response = await HttpUtil(context).post(Api.DISPLAY_LIST, data: parmas);

var datalistInfo = Datalist.fromJson(json.decode(response.toString()));

if (datalistInfo.code == 0) {

setState(() {

datalist = datalistInfo.data.displayerList;

});

setState(() {

dataLength = datalist.length;

});

//类型为视频

if (datalistInfo.data.playType == 2) {

setState(() {

type = 2;

});

//判断是否需要初始化

//不是第一次播放

if (controller != null &&

controller.ijkStatus == IjkStatus.noDatasource) {

controller.setNetworkDataSource(this.datalist[0].contentUrl,

autoPlay: true);

controller.play();

} else {

//第一次播放进行初始化

controller = IjkMediaController();

controller.setNetworkDataSource(this.datalist[0].contentUrl,

autoPlay: true);

//开启监听

Stream ijkStatusStream = controller.ijkStatusStream;

ijkStatusStream.listen((data) {

print(data);

var currentIndex = this.index;

//播放一个完成,下标+1

if (data == IjkStatus.complete) {

setState(() {

index = currentIndex + 1;

});

//播放一个完成,且列表的数据播放完成下标置0

if (this.datalist != null) {

if (this.index == this.dataLength) {

setState(() {

index = 0;

});

}

//reset后更新源

controller.reset();

controller.setNetworkDataSource(this.datalist[index].contentUrl,

autoPlay: true);

controller.play();

}

}

}, onError: (error) {

print("流发生错误");

}, onDone: () {

print("流已完成");

}, cancelOnError: false);

}

} else if (datalistInfo.data.playType == 1) {

setState(() {

type = 1;

});

}

} else {

//没有数据

setState(() {

type = 3;

});

}

}

}

你可能感兴趣的:(flutter)