fijkplayer是一款開(kāi)源免費(fèi)的Flutter視頻播放器,fijkplayer 使用 ijkplayer 作為播放器內(nèi)核。ijkplayer 使用 ffmpeg 進(jìn)行音視頻解封裝和解碼,同時(shí)添加了 Android 和 iOS 平臺(tái)特有的硬件加速解碼能力。
安裝步驟:
新建 Flutter App 項(xiàng)目
終端輸入以下命令,新建一個(gè)名為 playerapp 的 Flutter App 項(xiàng)目。
$ flutter create -t app playerapp
命令運(yùn)行結(jié)束后,F(xiàn)lutter 會(huì)給我們?nèi)缦绿崾尽?/p>
In order to run your application, type: $ cd playerapp $ flutter run Your application code is in playerapp/lib/main.dart.
連接上手機(jī)設(shè)備(或者打開(kāi) Android 模擬器),并且使用 flutter doctor 命令檢查設(shè)備是否連接成功。
$ flutter doctor Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, v1.7.8+hotfix.4, on Mac OS X 10.14.3 18D109, locale zh-Hans-CN) [✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3) [✓] Xcode - develop for iOS and macOS (Xcode 10.3) [✓] iOS tools - develop for iOS devices [✓] Android Studio (version 3.4) [✓] IntelliJ IDEA Ultimate Edition (version 2019.1.2) [✓] VS Code (version 1.36.1) [✓] Connected device (1 available) • No issues found!
在 flutter doctor 命令的輸出中,至少應(yīng)該含有 [✓] Connected device (1 available)
安裝 fijkplayer 依賴(lài)
進(jìn)入上一步中創(chuàng)建的目錄 playerapp 中,編輯其中的文件 pubspec.yaml ,增加依賴(lài) fijkplayer: ^0.0.7
dependencies: flutter: sdk: flutter + fijkplayer: ^0.0.7
然后在 playerapp 目錄中運(yùn)行如下命令安裝依賴(lài),等待命令成功完成。
$ flutter pub get --verbose
驗(yàn)證依賴(lài)安裝
安裝完 fijkplayer 之后我們先驗(yàn)證一下,確保安裝正確。
編輯 lib/main.dart 文件,在開(kāi)頭加入如下行,引入 fijkplayer。
import 'package:fijkplayer/fijkplayer.dart';
然后分別編譯 ios 和 android 項(xiàng)目,確保 build 成功
$ flutter build apk $ flutter build ios --no-codesign
如果 build apk 時(shí)太久時(shí)間沒(méi)有輸出,可以先在 android 目錄運(yùn)行 ./gradlew 檢查 gradle 環(huán)境是否正確。
播放器狀態(tài):
idle 閑置狀態(tài),剛完成構(gòu)造的 FijkPlayer 處于此狀態(tài)。
此狀態(tài)下播放器占用少量?jī)?nèi)存,無(wú)額外線程啟動(dòng)。
idle 狀態(tài)只能通過(guò) setDataSource 轉(zhuǎn)換為 initialized 狀態(tài)
initialized 初始化完成狀態(tài),和 idle 狀態(tài)相比,僅是多了輸入媒體數(shù)據(jù)源的信息。 同樣無(wú)額外線程打開(kāi)。
asyncPreparing 異步準(zhǔn)備狀態(tài),在 initialized 狀態(tài)調(diào)用 prepareAsync 到達(dá)此狀態(tài)。
這不是一個(gè)穩(wěn)定狀態(tài),此狀態(tài)等待特定任務(wù)完成后自動(dòng)轉(zhuǎn)化為 prepared 狀態(tài)。
這一狀態(tài)的主要準(zhǔn)備工作是 探測(cè)媒體文件類(lèi)型,打開(kāi)媒體文件,打開(kāi)解碼器以及新建解碼線程,新建數(shù)據(jù) read 線程,打開(kāi)音頻輸出設(shè)備,新建視頻輸出線程等。
prepared asyncPreparing 完成指定任務(wù)后自動(dòng)轉(zhuǎn)化為此狀態(tài)。
此狀態(tài)下已經(jīng)緩沖并解碼了一部分音視頻數(shù)據(jù),可以隨時(shí)進(jìn)行播放。
started 媒體(視頻、音頻)正在播放中。
paused 媒體(視頻、音頻)播放暫停。
completed 媒體(視頻、音頻)播放完成。 可重新從頭開(kāi)始播放。
stopped 播放器各種線程占用資源都已經(jīng)釋放。 音頻設(shè)備關(guān)閉。
end 播放器中所有需要手動(dòng)釋放的內(nèi)存都釋放完成。
處于此狀態(tài)的播放器只能等待垃圾回收進(jìn)行內(nèi)存釋放。