Flutter VideoPlayer 視頻播放

flutter的VideoPlayer 需要引入第三方框架來實(shí)現(xiàn)

//依賴
video_player: ^0.10.11

三方框架原地址

VideoPlayer的簡(jiǎn)單使用

class MyHome extends StatefulWidget {     //必須寫在有狀態(tài)組件內(nèi)
  @override
  _MyHomeState createState() => _MyHomeState();
}

class _MyHomeState extends State<MyHome> {
  VideoPlayerController _controller;      //先定義一個(gè)VideoPlayer的控制器變量
  @override
  void initState() {    //重寫組件初始化方法
    // TODO: implement initState
    super.initState();           
    _controller=VideoPlayerController.network(//定義連接器內(nèi)容雀彼,這里初學(xué)者可能有點(diǎn)難懂下面詳細(xì)講
      "http://shuixian.nihaozuida.com/20200622/5973_858fd5b6/index.m3u8"
    )..initialize().then((a){
      setState(() {

      });
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('視頻測(cè)試'),
      ),
      body: Center(
        child: _controller.value.initialized ? AspectRatio(   //     這里和上面是聯(lián)動(dòng)的,下面詳細(xì)講
          aspectRatio: _controller.value.aspectRatio,
          child: VideoPlayer(_controller),
        ):Container(
          width: 100,
          height: 100,
          color: Colors.blue,
        )
      ),
      floatingActionButton: FloatingActionButton(   //隨便定義一個(gè)按鈕用于測(cè)試
        onPressed: () {
          setState(() {
            _controller.value.isPlaying   //設(shè)置播放狀態(tài)
                ? _controller.pause()
                : _controller.play();
          });
        },
        child: Icon(
          _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }
}

使用起來還是挺簡(jiǎn)單的即寡,但是初學(xué)者的話徊哑,我標(biāo)出來的那兩個(gè)地方感覺還是挺難懂的,我下面會(huì)詳細(xì)說一下

 void initState() {    //重寫組件初始化方法
    // TODO: implement initState
    super.initState();           
    _controller=VideoPlayerController.network(//定義連接器內(nèi)容聪富,
      "http://shuixian.nihaozuida.com/20200622/5973_858fd5b6/index.m3u8"
    )..initialize().then((a){
      setState(() {

      });
    });
  }

這里是創(chuàng)建了一個(gè)網(wǎng)絡(luò)連接的VideoPlayerController挺好懂的莺丑,然后后面通過級(jí)聯(lián)的方式調(diào)用了控制器里面的初始化方法initialize(),因?yàn)榈眯枰W(wǎng)絡(luò)連接善涨,所以這個(gè)初始化方法是一個(gè)異步方法返回一個(gè)布爾值窒盐,記住這里是異步下面會(huì)說,然后調(diào)用Then()等這個(gè)異步方法執(zhí)行完畢后钢拧,進(jìn)行一個(gè)頁面刷新

Center(
        child: _controller.value.initialized ? AspectRatio(   //三元運(yùn)算符
          aspectRatio: _controller.value.aspectRatio,
          child: VideoPlayer(_controller),
        ):Container(
          width: 100,
          height: 100,
          color: Colors.blue,
        )
      ),

上面這里是組件初始化的時(shí)候蟹漓,進(jìn)行一個(gè)三目運(yùn)算,判斷初始化返回的布爾值源内,如果為true返回一個(gè)AspectRatio控件顯示視頻葡粒,如果不為true我反回了一個(gè)長(zhǎng)寬100的藍(lán)色方塊,下面看運(yùn)行效果

image.png

可以看見剛運(yùn)行的時(shí)候顯示的是一個(gè)藍(lán)色的方塊


image.png

短暫延遲后顯示的視頻播放控件膜钓,因?yàn)槲覀僔ideoPlayer控制器初始化過程是一個(gè)異步過程嗽交,前面給控制器賦值的時(shí)候,等初始化完畢了進(jìn)行頁面刷新的異步操作颂斜,所以下面的三目運(yùn)算夫壁,剛加載的時(shí)候會(huì)加載我們的藍(lán)色方塊,然后等初始化完畢沃疮,執(zhí)行了刷新頁面方法盒让,三目運(yùn)算就會(huì)返回咱們的視頻播放控件,然后就可以播放了

代碼是三方庫的示例代碼司蔬,基本用法就是這些大家可以盡情擴(kuò)展邑茄,定義自己的播放器,例如可以把現(xiàn)在的藍(lán)色方塊替換成圓形進(jìn)度條俊啼,有興趣的可以去三方庫查看源碼肺缕,上面掛了地址

展示效果.gif

簡(jiǎn)單的實(shí)現(xiàn)了一些功能,加載視頻的時(shí)候圓形進(jìn)度,橫向全屏同木,點(diǎn)擊暫停等浮梢,代碼在下面

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:orientation/orientation.dart';
import 'package:video_player/video_player.dart';

void main(){

  return runApp(MyApp2());
}


class MyApp2 extends StatefulWidget {
  @override
  _MyApp2State createState() => _MyApp2State();

}

class _MyApp2State extends State<MyApp2> {
  @override
  void initState() {
    super.initState();
    // Add code after super
    OrientationPlugin.forceOrientation(DeviceOrientation.landscapeRight);   //強(qiáng)制切換屏幕方向
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Video",
      home: MyHome(),
    );
  }
}




class MyHome extends StatefulWidget {
  @override
  _MyHomeState createState() => _MyHomeState();
}

class _MyHomeState extends State<MyHome> {
  VideoPlayerController _controller;  //定義一個(gè)控制器變量
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _controller=VideoPlayerController.network(
      "http://shuixian.nihaozuida.com/20200622/5973_858fd5b6/index.m3u8"
    )..initialize().then((a){
      setState(() {
        _controller.play();
      });
    });
  }
  @override
  Widget build(BuildContext context) {
    int dyone=0;
    var isPlay=_controller.value.isPlaying;
    List<Widget> a1=List();
    a1.add(Center(
        child:GestureDetector(
            onTap: (){
              setState(() {
                _controller.value.isPlaying?
                _controller.pause():_controller.play();
              });
            },
            child:  _controller.value.initialized ? AspectRatio(
              aspectRatio: _controller.value.aspectRatio,
              child: VideoPlayer(_controller),
            ):CircularProgressIndicator(backgroundColor: Colors.white,))
    ));
    if(_controller.value.initialized&&!isPlay){
      a1.add(Icon(Icons.arrow_drop_down_circle,size: 100));
    }
    return new Stack(
      alignment: Alignment.center,
      children:a1,
    );
  }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泉手,隨后出現(xiàn)的幾起案子黔寇,更是在濱河造成了極大的恐慌,老刑警劉巖斩萌,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異屏轰,居然都是意外死亡颊郎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門霎苗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姆吭,“玉大人,你說我怎么就攤上這事唁盏∧诶辏” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵厘擂,是天一觀的道長(zhǎng)昆淡。 經(jīng)常有香客問我,道長(zhǎng)刽严,這世上最難降的妖魔是什么昂灵? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮舞萄,結(jié)果婚禮上眨补,老公的妹妹穿的比我還像新娘。我一直安慰自己倒脓,他們只是感情好撑螺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崎弃,像睡著了一般甘晤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吊履,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天安皱,我揣著相機(jī)與錄音,去河邊找鬼艇炎。 笑死酌伊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播居砖,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼虹脯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了奏候?” 一聲冷哼從身側(cè)響起循集,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔗草,沒想到半個(gè)月后咒彤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咒精,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年镶柱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片模叙。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歇拆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出范咨,到底是詐尸還是另有隱情故觅,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布渠啊,位于F島的核電站输吏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昭抒。R本人自食惡果不足惜评也,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灭返。 院中可真熱鬧盗迟,春花似錦、人聲如沸熙含。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎静。三九已至邮弹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚓聘,已是汗流浹背腌乡。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夜牡,地道東北人与纽。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親急迂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子影所,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356