상세 컨텐츠

본문 제목

[Flutter] VlcPlayer 플러그인 상태 값

IT/응용

by SINAFLA 2021. 7. 14. 15:07

본문

반응형

영상이 제대로 재생된 경우

  • initialized → buffering → playing

 

처음부터 네트워크 연결 오류가 난 경우

  • initialized → buffering → stopped → error

 

재생 중일 때 연결이 끊긴 경우

  • initialized → buffering → playing → stopped → ended

 

  • Flutter의 플러그인으로 제공되는 VlcPlayer 플러그인은 리스너가 다양하지 않다.
  • 기본적으로 addListener() 함수가 제공되는데, 내가 원하는 기능을 추가하기 위해선 addListener() 메소드를 이용하는 경우가 많다.

 

VlcPlayer 플러그인의 상태 값 변화

  • VlcPlayer 플러그인은 PlayingState 란 플레이어의 상태 값이 ChangeNotifier로 변경이 된다.
  • 즉 flutter의 provider 플러그인을 사용해 상태 값이 변화되는 걸 감지하는 걸 알리기 때문에 addListener() 메소드에서 VlcPlayer의 상태 값 변화를 확인할 수 있다.

 

class VlcMain extends StatefulWidget {
  final VlcPlayerController controller;
  final Function endedListener;
  final Function initializedListener;
  final Function playingListener;
  final Function stoppingListener;
  final Function errorListener;

  VlcMain({this.controller, this.endedListener, this.initializedListener, this.playingListener, this.stoppingListener, this.errorListener});

  @override
  _VlcMainState createState() => _VlcMainState();
}

class _VlcMainState extends State<VlcMain> {
  PlayingState _state;

  @override
  void initState() {
    super.initState();
    widget.controller.addListener(() async {
      final PlayingState state = widget.controller.value.playingState;
      setState(() {
        _state = state;
      });

      switch(_state) {
        case PlayingState.initialized:
          widget.initializedListener();
          widget.controller.play();
          break;
        case PlayingState.playing:
          widget.playingListener();
          break;
        case PlayingState.stopped:
          widget.stoppingListener();
          break;
        case PlayingState.error:
          widget.errorListener();
          break;
        case PlayingState.ended:
          widget.endedListener();
          break;
      }
    });
  }

  @override
  void dispose() {
    if(widget.controller != null && mounted) {
      widget.controller.stopRendererScanning();
      widget.controller.dispose();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return VlcPlayer(controller: widget.controller, aspectRatio:16 / 9,);
  }
}

 

VideoPlayerCotnroller와 VlcPlayer 위젯 분리

  • VlcPlayer가 작동하는 클래스와 VideoPlayerController를 초기화하는 클래스를 나눈 이유는 변화하는 상태 값마다 리스너 메소드를 적용해 VlcPlayer 위젯을 build 하기 위함이다.

 

 

반응형

관련글 더보기

댓글 영역