用的是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.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;
});
}
}
}