fijkplayer是一款開源免費的Flutter視頻播放器,fijkplayer 使用 ijkplayer 作為播放器內核。ijkplayer 使用 ffmpeg 進行音視頻解封裝和解碼,同時添加了 Android 和 iOS 平臺特有的硬件加速解碼能力。
安裝步驟:
新建 Flutter App 項目
終端輸入以下命令,新建一個名為 playerapp 的 Flutter App 項目。
$ flutter create -t app playerapp
命令運行結束后,Flutter 會給我們如下提示。
In order to run your application, type: $ cd playerapp $ flutter run Your application code is in playerapp/lib/main.dart.
連接上手機設備(或者打開 Android 模擬器),并且使用 flutter doctor 命令檢查設備是否連接成功。
$ 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 命令的輸出中,至少應該含有 [✓] Connected device (1 available)
安裝 fijkplayer 依賴
進入上一步中創(chuàng)建的目錄 playerapp 中,編輯其中的文件 pubspec.yaml ,增加依賴 fijkplayer: ^0.0.7
dependencies: flutter: sdk: flutter + fijkplayer: ^0.0.7
然后在 playerapp 目錄中運行如下命令安裝依賴,等待命令成功完成。
$ flutter pub get --verbose
驗證依賴安裝
安裝完 fijkplayer 之后我們先驗證一下,確保安裝正確。
編輯 lib/main.dart 文件,在開頭加入如下行,引入 fijkplayer。
import 'package:fijkplayer/fijkplayer.dart';
然后分別編譯 ios 和 android 項目,確保 build 成功
$ flutter build apk $ flutter build ios --no-codesign
如果 build apk 時太久時間沒有輸出,可以先在 android 目錄運行 ./gradlew 檢查 gradle 環(huán)境是否正確。
播放器狀態(tài):
idle 閑置狀態(tài),剛完成構造的 FijkPlayer 處于此狀態(tài)。
此狀態(tài)下播放器占用少量內存,無額外線程啟動。
idle 狀態(tài)只能通過 setDataSource 轉換為 initialized 狀態(tài)
initialized 初始化完成狀態(tài),和 idle 狀態(tài)相比,僅是多了輸入媒體數據源的信息。 同樣無額外線程打開。
asyncPreparing 異步準備狀態(tài),在 initialized 狀態(tài)調用 prepareAsync 到達此狀態(tài)。
這不是一個穩(wěn)定狀態(tài),此狀態(tài)等待特定任務完成后自動轉化為 prepared 狀態(tài)。
這一狀態(tài)的主要準備工作是 探測媒體文件類型,打開媒體文件,打開解碼器以及新建解碼線程,新建數據 read 線程,打開音頻輸出設備,新建視頻輸出線程等。
prepared asyncPreparing 完成指定任務后自動轉化為此狀態(tài)。
此狀態(tài)下已經緩沖并解碼了一部分音視頻數據,可以隨時進行播放。
started 媒體(視頻、音頻)正在播放中。
paused 媒體(視頻、音頻)播放暫停。
completed 媒體(視頻、音頻)播放完成。 可重新從頭開始播放。
stopped 播放器各種線程占用資源都已經釋放。 音頻設備關閉。
end 播放器中所有需要手動釋放的內存都釋放完成。
處于此狀態(tài)的播放器只能等待垃圾回收進行內存釋放。