Flutter 視頻播放

在 Flutter 里官方提供了一個(gè) video_player插件可以播放視頻柠掂。

先安裝依賴:

dependencies:
  video_player: ^0.6.4

基本使用

class _VideoAppState extends State<VideoApp> {
    VideoPlayerController _controller;
    bool _isPlaying = false;
    String url = 'http://vd3.bdstatic.com/mda-ifvq' +
                'u9yp3eaqueep/mda-ifvqu9yp3eaqueep.mp4';

    @override
    void initState() {
        super.initState();
        _controller = VideoPlayerController.network(this.url)
        // 播放狀態(tài)
        ..addListener(() {
            final bool isPlaying = _controller.value.isPlaying;
            if (isPlaying != _isPlaying) {
                setState(() { _isPlaying = isPlaying; });
            }
        })
        // 在初始化完成后必須更新界面
        ..initialize().then((_) {
            setState(() {});
        });
    }

    @override
    Widget build(BuildContext context) {
        return MaterialApp(
            title: 'Video Demo',
            home: new Scaffold(
                body: new Center(
                child: _controller.value.initialized
                    // 加載成功
                    ? new AspectRatio(
                        aspectRatio: _controller.value.aspectRatio,
                        child: VideoPlayer(_controller),
                    ) : new Container(),
                ),
                floatingActionButton: new FloatingActionButton(
                    onPressed: _controller.value.isPlaying
                        ? _controller.pause
                        : _controller.play,
                    child: new Icon(
                        _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
                    ),
                ),
            ),
        );
    }
}

下面是在模擬器下看到的效果(略卡)。


video_player 的 controller 有以下方法可用:

  • initialize() - 初始化播放器忍捡。
  • dispose() - 釋放播放器資源。
  • notifyListeners() - 監(jiān)聽(tīng)播放消息澎粟。
  • addListener(listener) - 添加監(jiān)聽(tīng)器奇昙。
  • removeListener(listener) - 移除監(jiān)聽(tīng)器。
  • pause() - 暫停播放群叶。
  • play() - 開(kāi)始播放漠嵌。
  • position - 播放位置。
  • seekTo(moment) - 指定到某個(gè)位置播放盖呼。
  • setLooping(looping) - 是否循環(huán)播放儒鹿。
  • setVolume(volume) - 設(shè)置音量大小。

使用 chewie

chewie几晤,是一個(gè)非官方的第三方視頻播放組件约炎,看起來(lái)好像是基于 HTML5 播放的組件。chewie 相對(duì) video_player 來(lái)說(shuō)蟹瘾,有控制欄和全屏的功能圾浅。Chewie 使用 video_player 引擎并將其包裹在友好的 Material 或 Cupertino UI 中!
安裝依賴:

dependencies
  chewie: ^0.6.1

基本使用:

import 'package:chewie/chewie.dart';

new Center(
    child: new Chewie(
        new VideoPlayerController.network(this.url),
        aspectRatio: 16 / 9,
        autoPlay: !true,
        looping: true,
        showControls: true,
        // 占位圖
        placeholder: new Container(
            color: Colors.grey,
        ),

        // 是否在 UI 構(gòu)建的時(shí)候就加載視頻
        autoInitialize: !true,

        // 拖動(dòng)條樣式顏色
        materialProgressColors: new ChewieProgressColors(
            playedColor: Colors.red,
            handleColor: Colors.blue,
            backgroundColor: Colors.grey,
            bufferedColor: Colors.lightGreen,
        ),
    ),
),


chewie 實(shí)際上就是為 video_player 做了一個(gè) UI 上的封裝憾朴,因?yàn)?UI 實(shí)在長(zhǎng)得太像狸捕。

控制欄樣式?

chewie 并不能自定義控制欄樣式众雷,那只能自己修改源碼了(修改的版本是 v0.6.1)灸拍。

首先打開(kāi)文件:chewie/lib/src/material_controls.dart做祝,在里面定義兩個(gè)變量。

const lightColor = Color.fromRGBO(255, 255, 255, 0.85);
const darkColor = Color.fromRGBO(1, 1, 1, 0.35);
接著添加顏色值鸡岗。

// 在 _buildExpandButton 下混槐,大約 127 行
child: new Icon(
    widget.fullScreen ? Icons.fullscreen_exit : Icons.fullscreen,
    color: lightColor,
),

// 在 _buildHitArea 下,大約 157 行
decoration: new BoxDecoration(
    color: Colors.black54,
    borderRadius: new BorderRadius.circular(48.0),
),
// 167 行
child: new Icon(
    Icons.play_arrow,
    size: 32.0,
    color: lightColor,
),

// 在 _buildMuteButton 下轩性,大約 206 行
child: new Icon(
    color: lightColor,
),

// 在 _buildPlayPause 下声登,大約 228 行
child: new Icon(
    controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
    color: lightColor,
),

// 在 _buildPosition 下,大約 244 行
style: new TextStyle(
    fontSize: 14.0,
    color: lightColor,
),

// 在 _buildProgressBar 下揣苏,尾行
new ChewieProgressColors(
    playedColor: lightColor,
    handleColor: lightColor,
    bufferedColor: Colors.white30,
    backgroundColor: darkColor,
),

此外 chewie 在全屏?xí)r沒(méi)有一個(gè)退出全屏的返回按鈕和標(biāo)題顯示悯嗓,接著改。

// 在 build 里加一個(gè) _buildHeader()卸察,這個(gè) header 需要自己定義绅作。
@override
Widget build(BuildContext context) {
    return new Column(
        children: <Widget>[
            // 在全屏?xí)r才顯示
            widget.fullScreen ? _buildHeader(context, _title) : new Container(),
            _buildHitArea(),
            _buildBottomBar(context, widget.controller),
        ],
    );
}

AnimatedOpacity _buildHeader(BuildContext context, String title) {
    return new AnimatedOpacity(
        opacity: _hideStuff ? 0.0 : 1.0,
        duration: new Duration(milliseconds: 300),
        child: new Container(
            color: darkColor,
            height: barHeight,
            child: new Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                    new IconButton(
                        onPressed: _onExpandCollapse,
                        color: lightColor,
                        icon: new Icon(Icons.chevron_left),
                    ),
                    new Text(
                        '$title',
                        style: new TextStyle(
                            color: lightColor,
                            fontSize: 18.0,
                        ),
                    ),
                ],
            ),
        ),
    );
}

標(biāo)題是從上下文獲取的,因此要一級(jí)一級(jí)的傳遞下去蛾派。

// chewie/lib/src/chewie_player.dart 文件

// 標(biāo)題
final String title;

// 在構(gòu)造函數(shù)處
this.title = '',

// 在 92 行左右俄认,PlayerWithControls 構(gòu)造的時(shí)候(有兩個(gè)位置,兩個(gè)都要加)
title: widget.title,

// chewie/lib/src/player_with_controls.dart 文件

// 標(biāo)題
final String title;

// 在構(gòu)造函數(shù)處
this.title = '',

// 在 92 行左右洪乍,MaterialControls 構(gòu)造的時(shí)候
title: widget.title,

// chewie/lib/src/material_controls.dart
final String title;
@required this.title,
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眯杏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子壳澳,更是在濱河造成了極大的恐慌岂贩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巷波,死亡現(xiàn)場(chǎng)離奇詭異萎津,居然都是意外死亡坑律,警方通過(guò)查閱死者的電腦和手機(jī)哼凯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)办龄,“玉大人垮耳,你說(shuō)我怎么就攤上這事颈渊。” “怎么了终佛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵俊嗽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我铃彰,道長(zhǎng)绍豁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任牙捉,我火速辦了婚禮竹揍,結(jié)果婚禮上敬飒,老公的妹妹穿的比我還像新娘。我一直安慰自己鬼佣,他們只是感情好驶拱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布霜浴。 她就那樣靜靜地躺著晶衷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阴孟。 梳的紋絲不亂的頭發(fā)上晌纫,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音永丝,去河邊找鬼锹漱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛慕嚷,可吹牛的內(nèi)容都是我干的哥牍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼喝检,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嗅辣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起挠说,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤澡谭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后损俭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛙奖,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年杆兵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雁仲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琐脏,死狀恐怖伯顶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骆膝,我是刑警寧澤祭衩,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站阅签,受9級(jí)特大地震影響掐暮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜政钟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一路克、第九天 我趴在偏房一處隱蔽的房頂上張望樟结。 院中可真熱鬧,春花似錦精算、人聲如沸瓢宦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驮履。三九已至,卻和暖如春廉嚼,著一層夾襖步出監(jiān)牢的瞬間玫镐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工怠噪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恐似,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓傍念,卻偏偏與公主長(zhǎng)得像矫夷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子憋槐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1双藕、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,988評(píng)論 3 119
  • 想你的時(shí)候 真的是要哭出來(lái)了呢 我什么時(shí)候 才可以云淡風(fēng)輕的說(shuō)一句 啊 又想起你了
    十八只魚(yú)閱讀 306評(píng)論 5 4
  • 今天一哥們給我打電話說(shuō)自己要裝監(jiān)控蔓彩,我問(wèn)他要幾個(gè),他說(shuō)驳概,十來(lái)個(gè)吧赤嚼。我的大兄弟,在哪發(fā)了橫財(cái)顺又,買了什么豪宅啊更卒,要這么...
    暖心晴子閱讀 253評(píng)論 0 0
  • 年輕時(shí)總想著有機(jī)會(huì)能乘坐飛機(jī)旅行一次,想象著那是一種多么高端稚照、大氣蹂空、上檔次的人生體驗(yàn)。 97年的春天果录,機(jī)會(huì)終于來(lái)了...
    清淺墨客閱讀 292評(píng)論 0 1