提交 9feccf1d authored 作者: kongdywang's avatar kongdywang

fix android play error in some cases & fix player bug

上级 3cf55d9e
...@@ -189,9 +189,6 @@ public class FTXVodPlayer extends FTXBasePlayer implements MethodChannel.MethodC ...@@ -189,9 +189,6 @@ public class FTXVodPlayer extends FTXBasePlayer implements MethodChannel.MethodC
if (mSurfaceTextureEntry != null && mSurfaceTextureEntry.surfaceTexture() != null) { if (mSurfaceTextureEntry != null && mSurfaceTextureEntry.surfaceTexture() != null) {
SurfaceTexture surfaceTexture = mSurfaceTextureEntry.surfaceTexture(); SurfaceTexture surfaceTexture = mSurfaceTextureEntry.surfaceTexture();
surfaceTexture.setDefaultBufferSize(width, height); surfaceTexture.setDefaultBufferSize(width, height);
if (mSurface != null) {
mSurface.release();
}
mSurface = new Surface(surfaceTexture); mSurface = new Surface(surfaceTexture);
mVodPlayer.setSurface(mSurface); mVodPlayer.setSurface(mSurface);
} }
......
// Copyright (c) 2022 Tencent. All rights reserved. // Copyright (c) 2022 Tencent. All rights reserved.
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:super_player/super_player.dart'; import 'package:super_player/super_player.dart';
import 'package:superplayer_widget/demo_superplayer_lib.dart'; import 'package:superplayer_widget/demo_superplayer_lib.dart';
import 'shortvideo/demo_short_video_lib.dart'; import 'shortvideo/demo_short_video_lib.dart';
class DemoShortVideoPlayer extends StatefulWidget { class DemoShortVideoPlayer extends StatefulWidget {
@override @override
_DemoShortVideoPlayerState createState() => _DemoShortVideoPlayerState(); _DemoShortVideoPlayerState createState() => _DemoShortVideoPlayerState();
} }
...@@ -33,21 +33,39 @@ class _DemoShortVideoPlayerState extends State<DemoShortVideoPlayer> with Widget ...@@ -33,21 +33,39 @@ class _DemoShortVideoPlayerState extends State<DemoShortVideoPlayer> with Widget
List<Widget> widgetList = []; List<Widget> widgetList = [];
for (int i = 0; i < superPlayerModelList.length; i++) { for (int i = 0; i < superPlayerModelList.length; i++) {
widgetList.add(ShortVideoPageWidget( widgetList.add(ShortVideoPageWidget(
position: i, position: i, videoUrl: superPlayerModelList[i].videoURL, coverUrl: superPlayerModelList[i].coverUrl));
videoUrl: superPlayerModelList[i].videoURL,
coverUrl: superPlayerModelList[i].coverUrl));
} }
return PageView( return Stack(
children: [
PageView(
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
onPageChanged: (int index) { onPageChanged: (int index) {
LogUtils.i(TAG,"[onPageEndChanged] outside ${_currentIndex.toString()} ——》 ${index.toString()}"); LogUtils.i(TAG, "[onPageEndChanged] outside ${_currentIndex.toString()} ——》 ${index.toString()}");
_stopAndPlay(index); _stopAndPlay(index);
}, },
children: widgetList, children: widgetList,
),
SafeArea(
child: Positioned(
left: 0,
top: 0,
child: InkWell(
onTap: _onBackTap,
child: const Image(
width: 40,
height: 40,
image: AssetImage("images/superplayer_btn_back_play.png", package: StringResource.PKG_NAME),
),
))),
],
); );
} }
void _onBackTap() {
Navigator.of(context).pop();
}
@override @override
void didChangeAppLifecycleState(AppLifecycleState state) { void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state); super.didChangeAppLifecycleState(state);
...@@ -63,7 +81,6 @@ class _DemoShortVideoPlayerState extends State<DemoShortVideoPlayer> with Widget ...@@ -63,7 +81,6 @@ class _DemoShortVideoPlayerState extends State<DemoShortVideoPlayer> with Widget
} }
} }
_stopAndPlay(int index) async { _stopAndPlay(int index) async {
EventBusUtils.getInstance().fire(new StopAndResumeEvent(index)); EventBusUtils.getInstance().fire(new StopAndResumeEvent(index));
_currentIndex = index; _currentIndex = index;
......
...@@ -202,23 +202,22 @@ class _DemoSuperPlayerState extends State<DemoSuperPlayer> with TXPipPlayerResto ...@@ -202,23 +202,22 @@ class _DemoSuperPlayerState extends State<DemoSuperPlayer> with TXPipPlayerResto
model.appId = appId; model.appId = appId;
if (url.isNotEmpty) { if (url.isNotEmpty) {
model.videoURL = url; model.videoURL = url;
playCurrentModel(model, 0);
} else if (appId != 0 && fileId.isNotEmpty) { } else if (appId != 0 && fileId.isNotEmpty) {
model.videoId = new SuperPlayerVideoId(); model.videoId = new SuperPlayerVideoId();
model.videoId!.fileId = fileId; model.videoId!.fileId = fileId;
if (pSign.isNotEmpty) { if (pSign.isNotEmpty) {
model.videoId!.psign = pSign; model.videoId!.psign = pSign;
} }
} else {
EasyLoading.showError("请输入播放地址!");
return;
}
loader.getVideoData(model, (resultModel) { loader.getVideoData(model, (resultModel) {
setState(() { setState(() {
videoModels.add(resultModel); videoModels.add(resultModel);
}); });
playCurrentModel(resultModel, 0); playCurrentModel(resultModel, 0);
}); });
} else {
EasyLoading.showError("请输入播放地址!");
}
}, },
needPisgn: !isLive, needPisgn: !isLive,
showFileEdited: !isLive, showFileEdited: !isLive,
......
...@@ -24,7 +24,7 @@ class _DemoTXVodPlayerState extends State<DemoTXVodPlayer> ...@@ -24,7 +24,7 @@ class _DemoTXVodPlayerState extends State<DemoTXVodPlayer>
int _volume = 100; int _volume = 100;
List _supportedBitrates = []; List _supportedBitrates = [];
int _curBitrateIndex = 0; int _curBitrateIndex = 0;
String _url = "http://1400329073.vod2.myqcloud.com/d62d88a7vodtranscq1400329073/59c68fe75285890800381567412/adp.10.m3u8"; String _url = "http://1500005830.vod2.myqcloud.com/43843ec0vodtranscq1500005830/48d0f1f9387702299774251236/adp.10.m3u8";
int _appId = 0; int _appId = 0;
String _fileId = ""; String _fileId = "";
double _rate = 1.0; double _rate = 1.0;
......
...@@ -6,10 +6,7 @@ class ShortVideoPageWidget extends StatefulWidget { ...@@ -6,10 +6,7 @@ class ShortVideoPageWidget extends StatefulWidget {
String coverUrl; String coverUrl;
int position; int position;
ShortVideoPageWidget( ShortVideoPageWidget({required this.position, required this.videoUrl, required this.coverUrl});
{required this.position,
required this.videoUrl,
required this.coverUrl});
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {
...@@ -33,11 +30,10 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> { ...@@ -33,11 +30,10 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
TXVodPlayerController _controller; TXVodPlayerController _controller;
_TXVodPlayerPageState() : _controller = TXVodPlayerController(){ _TXVodPlayerPageState() : _controller = TXVodPlayerController() {
_txPlayerVideo = new TXPlayerVideo(controller: _controller); _txPlayerVideo = new TXPlayerVideo(controller: _controller);
} }
@override @override
void initState() { void initState() {
super.initState(); super.initState();
...@@ -47,7 +43,8 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> { ...@@ -47,7 +43,8 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
_init() async { _init() async {
await _controller.initialize(); await _controller.initialize();
_controller.setConfig(FTXVodPlayConfig()); _controller.setConfig(FTXVodPlayConfig());
LogUtils.i(TAG, " [init] ${widget.position.toString()} ${this.hashCode.toString()} ${_controller.hashCode.toString()}"); LogUtils.i(
TAG, " [init] ${widget.position.toString()} ${this.hashCode.toString()} ${_controller.hashCode.toString()}");
_setPlayerListener(); _setPlayerListener();
_setEventBusListener(); _setEventBusListener();
if (widget.position == 0) { if (widget.position == 0) {
...@@ -73,16 +70,13 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> { ...@@ -73,16 +70,13 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
_playEventSubscription?.cancel(); _playEventSubscription?.cancel();
await _stop(); await _stop();
_controller.dispose(); _controller.dispose();
LogUtils.i(TAG, " [dispose] ${widget.position.toString()} ${this.hashCode.toString()} ${_controller.hashCode.toString()}"); LogUtils.i(
TAG, " [dispose] ${widget.position.toString()} ${this.hashCode.toString()} ${_controller.hashCode.toString()}");
} }
Widget _getTXVodPlayerMainPage() { Widget _getTXVodPlayerMainPage() {
return Stack( return Stack(
children: <Widget>[ children: <Widget>[_getGestureDetectorView(), _getPreviewImg(), _getSeekBarView()],
_getGestureDetectorView(),
_getPreviewImg(),
_getSeekBarView()
],
); );
} }
...@@ -103,18 +97,21 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> { ...@@ -103,18 +97,21 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
_onTapPageView() { _onTapPageView() {
_controller.isPlaying().then((value) { _controller.isPlaying().then((value) {
value ? _pause() :_resume(); value ? _pause() : _resume();
}); });
LogUtils.i(TAG, "tap ${_isVideoPlaying.toString()}"); LogUtils.i(TAG, "tap ${_isVideoPlaying.toString()}");
} }
Widget _getSeekBarView() { Widget _getSeekBarView() {
return Positioned( return SafeArea(
child: Stack(children: [
Positioned(
child: VideoSliderView(_controller, _progressSliderKey), child: VideoSliderView(_controller, _progressSliderKey),
bottom: 20, bottom: 20,
right: 0, right: 0,
left: 0, left: 0,
); )
],));
} }
Widget _getPauseView() { Widget _getPauseView() {
...@@ -122,7 +119,8 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> { ...@@ -122,7 +119,8 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
offstage: _isVideoPlaying, offstage: _isVideoPlaying,
child: Align( child: Align(
child: Container( child: Container(
child: Image(image: AssetImage("images/superplayer_ic_vod_play_normal.png", package:StringResource.PKG_NAME)), child: Image(
image: AssetImage("images/superplayer_ic_vod_play_normal.png", package: StringResource.PKG_NAME)),
height: 50, height: 50,
width: 50), width: 50),
alignment: Alignment.center, alignment: Alignment.center,
...@@ -144,7 +142,7 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> { ...@@ -144,7 +142,7 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
))); )));
} }
_pause() async{ _pause() async {
LogUtils.i(TAG, "[_pause]"); LogUtils.i(TAG, "[_pause]");
await _controller.pause(); await _controller.pause();
setState(() { setState(() {
...@@ -152,7 +150,7 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> { ...@@ -152,7 +150,7 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
}); });
} }
_resume() async{ _resume() async {
LogUtils.i(TAG, "[_resume]"); LogUtils.i(TAG, "[_resume]");
await _controller.resume(); await _controller.resume();
setState(() { setState(() {
...@@ -161,11 +159,12 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> { ...@@ -161,11 +159,12 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
} }
_stopLastAndPlayCurrent(StopAndResumeEvent event) { _stopLastAndPlayCurrent(StopAndResumeEvent event) {
LogUtils.i(TAG, " [received at not current outside] ${widget.position.toString()} ${this.hashCode.toString()} ${widget.hashCode.toString()} ${_controller.hashCode.toString()}"); LogUtils.i(TAG,
event.index != widget.position ? _stop() :_startPlay(); " [received at not current outside] ${widget.position.toString()} ${this.hashCode.toString()} ${widget.hashCode.toString()} ${_controller.hashCode.toString()}");
event.index != widget.position ? _stop() : _startPlay();
} }
Future<void> _stop() async{ Future<void> _stop() async {
if (!mounted) return; if (!mounted) return;
LogUtils.i(TAG, " [stop] ${widget.position.toString()} ${widget.hashCode.toString()}"); LogUtils.i(TAG, " [stop] ${widget.position.toString()} ${widget.hashCode.toString()}");
_isVideoPrepared = false; _isVideoPrepared = false;
...@@ -173,8 +172,6 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> { ...@@ -173,8 +172,6 @@ class _TXVodPlayerPageState extends State<ShortVideoPageWidget> {
_controller.stop(); _controller.stop();
} }
_startPlay() async { _startPlay() async {
LogUtils.i(TAG, " [_startPlay]"); LogUtils.i(TAG, " [_startPlay]");
setState(() { setState(() {
......
...@@ -26,6 +26,7 @@ class SuperVodDataLoader { ...@@ -26,6 +26,7 @@ class SuperVodDataLoader {
var request = await httpClient.getUrl(Uri.parse(url)); var request = await httpClient.getUrl(Uri.parse(url));
var response = await request.close(); var response = await request.close();
if (response.statusCode != HttpStatus.ok) { if (response.statusCode != HttpStatus.ok) {
callback(model);
return; return;
} }
var json = await response.transform(utf8.decoder).join(); var json = await response.transform(utf8.decoder).join();
...@@ -35,6 +36,7 @@ class SuperVodDataLoader { ...@@ -35,6 +36,7 @@ class SuperVodDataLoader {
String warning = root['warning']; String warning = root['warning'];
LogUtils.d(TAG, "_getVodListData,code=($code, ${PlayInfoProtocol.getV4ErrorCodeDescription(code)}),message=$message,warning=$warning"); LogUtils.d(TAG, "_getVodListData,code=($code, ${PlayInfoProtocol.getV4ErrorCodeDescription(code)}),message=$message,warning=$warning");
if (code != 0) { if (code != 0) {
callback(model);
return; return;
} }
int version = root['version']; int version = root['version'];
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论