Flutter_學習記錄_video_player、chewie 播放視頻

1. video_player 視頻播放

插件地址:https://pub.dev/packages/video_player

  1. 添加插件
    在這里插入圖片描述
  2. 導入頭文件
import 'package:video_player/video_player.dart';
  1. Android配置(iOS不用配置)

修改這個文件:/android/app/src/main/AndroidManifest.xml;
添加下面的配置:

<uses-permission android:name="android.permission.INTERNET"/>
  1. 添加核心代碼

初始化播放器:

Uri url = Uri.parse("https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4");_videoPlayerController = VideoPlayerController.networkUrl(url);_videoPlayerController.initialize().then((_){print("播放器初始化完成");// 添加播放器的監聽_videoPlayerController.addListener(_onVideoChange);// 設置自動播放_videoPlayerController.play();_isPlaying = true;setState(() {print("111111");});});

添加播放器的視圖:

return VideoPlayer(_videoPlayerController);

退出頁面時,需要銷毀播放器:

 void dispose() {_videoPlayerController.dispose();super.dispose();}
  1. 完整代碼
import 'dart:async';import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';class VideoPlayerDemo extends StatefulWidget {const VideoPlayerDemo({super.key});State<VideoPlayerDemo> createState() => _VideoPlayerDemoState();
}class _VideoPlayerDemoState extends State<VideoPlayerDemo> {late VideoPlayerController _videoPlayerController;bool _isPlaying = false;double _progress = 0.0;// 添加播放狀態的訂閱,避免每次調用setState 重刷頁面late StreamController _isPlayingController;// 添加播放進度的訂閱,避免每次調用setState 重刷頁面late StreamController _progressController;void initState() {super.initState();_isPlayingController = StreamController.broadcast();_progressController = StreamController.broadcast();Uri url = Uri.parse("https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4");_videoPlayerController = VideoPlayerController.networkUrl(url);_videoPlayerController.initialize().then((_){print("播放器初始化完成");// 添加播放器的監聽_videoPlayerController.addListener(_onVideoChange);// 設置自動播放_videoPlayerController.play();_isPlaying = true;setState(() {});});}void dispose() {_videoPlayerController.dispose();_isPlayingController.close();_progressController.close();super.dispose();}// 自定義播放器的監聽回調的方法void _onVideoChange() {print("播放器的監聽回調");if (_videoPlayerController.value.isInitialized) {final isPlaying = _videoPlayerController.value.isPlaying;if (isPlaying != _isPlaying) {_isPlaying = isPlaying;_isPlayingController.sink.add(_isPlaying);}// 更新播放進度final position = _videoPlayerController.value.position;final duration = _videoPlayerController.value.duration;if (duration != null) {_progress = position.inMilliseconds / duration.inMilliseconds;print("進度 = $_progress");_progressController.sink.add(_progress);}// 檢查視頻是否播放完畢if (position >= duration) {print('Video has completed playing.');_videoPlayerController.seekTo(Duration.zero); // 重置到開始位置_videoPlayerController.pause(); // 暫停播放_isPlaying = false;_isPlayingController.add(_isPlaying);}}}// 播放器的視圖Widget _palyerViewWidget() {if (_videoPlayerController.value.isInitialized) {// 初始化成功return AspectRatio(aspectRatio: _videoPlayerController.value.aspectRatio,child: Stack(children: [// 播放器VideoPlayer(_videoPlayerController),// 添加進度條Align(alignment: Alignment.bottomCenter,child: _progressWidget(),)],));} else {// loading視圖return CircularProgressIndicator();}}// 進度條Widget _progressWidget() {// 進度條變化比較頻繁:用 StreamBuilder 減少內存的消耗return  StreamBuilder(stream: _progressController.stream, builder: (context, snapshot) {print("更新進度條");return SizedBox(height: 35,child: Slider(value: _progress,onChanged: (value) {print("onChanged");setState(() {_videoPlayerController.seekTo(Duration(milliseconds: (value * _videoPlayerController.value.duration.inMilliseconds).round()));});},),);});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Video_Player_demo"),),body: Center(child: _palyerViewWidget(),),floatingActionButton: FloatingActionButton(onPressed: (){if (_isPlaying) {// 正在播放_videoPlayerController.pause();_isPlaying = false;} else {_videoPlayerController.play();_isPlaying = true;}_isPlayingController.add(_isPlaying);},// 這個按鈕變化比較頻繁:用 StreamBuilder 減少內存的消耗child: StreamBuilder(stream: _isPlayingController.stream, builder: (context, snapshot) {return Icon(_isPlaying ? Icons.pause : Icons.play_arrow);}),),);}
}
  1. 效果圖如下:
    在這里插入圖片描述

2. chewie 播放視頻

在 Flutter 里官方提供了一個 video_player插件可以播放視頻,但video_player有一些局限性:沒法控制底部播放進度等。
所以可以用另外一個三方的視頻播放庫chewie
chewie是一個非官方的第三方視頻播放組件,看起來好像是基于 HTML5 播放的組件。
chewie 相對 video_player 來說,有控制欄和全屏的功能
Chewie 使用 video_player 引擎并將其包裹在友好的 Material 或 Cupertino UI中!

插件地址:https://pub.dev/packages/chewie

  1. 引入插件
    chewie基于video_player,所以要使用chewie必須配置video_player
    在這里插入圖片描述
  2. 導入頭文件
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
  1. Android配置(iOS不用配置)

修改這個文件:/android/app/src/main/AndroidManifest.xml;
添加下面的配置:

<uses-permission android:name="android.permission.INTERNET"/>
  1. 核心代碼
import 'package:chewie/chewie.dart';
import 'package:video_player/video_player.dart';final videoPlayerController = VideoPlayerController.networkUrl(Uri.parse('https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4'));await videoPlayerController.initialize();final chewieController = ChewieController(videoPlayerController: videoPlayerController,autoPlay: true,looping: true,
);final playerWidget = Chewie(controller: chewieController,
);

退出頁面時,需要銷毀播放器:

 void dispose() {_videoPlayerController.dispose();_chewieController.dispose();super.dispose();}
  1. 完整代碼
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';class ChewieDemo extends StatefulWidget {const ChewieDemo({super.key});State<ChewieDemo> createState() => _ChewieDemoState();
}class _ChewieDemoState extends State<ChewieDemo> {late VideoPlayerController _videoPlayerController;late ChewieController _chewieController;void initState() {super.initState();// 初始化播放器_initVideo();}void dispose() {_videoPlayerController.dispose();_chewieController.dispose();super.dispose();}// 初始化播放器void _initVideo() async {Uri url = Uri.parse("https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4");_videoPlayerController = VideoPlayerController.networkUrl(url);await _videoPlayerController.initialize();_chewieController = ChewieController(videoPlayerController: _videoPlayerController,aspectRatio: _videoPlayerController.value.aspectRatio,autoPlay: true,looping: false);setState(() {});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Chewie demo-在線播放視頻"),),body: Center(child: _videoPlayerController.value.isInitialized ? AspectRatio(aspectRatio: _videoPlayerController.value.aspectRatio,child: Chewie(controller: _chewieController),) : CircularProgressIndicator(),),);}
}
  1. 效果圖:
    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72489.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VSCode通過SSH免密遠程登錄Windows服務器

系列 1.1 VSCode通過SSH遠程登錄Windows服務器 1.2 VSCode通過SSH免密遠程登錄Windows服務器 文章目錄 系列1 準備工作2 本地電腦配置2.1 生成密鑰2.2 VS Code配置密鑰 3. 服務端配置3.1 配置SSH服務器sshd_config3.2 復制公鑰3.3 配置權限&#xff08;常見問題&#xff09;3.…

強大的數據庫DevOps工具:NineData 社區版

本文作者司馬遼太杰&#xff0c; gzh&#xff1a;程序猿讀歷史 在業務快速變化與數據安全日益重要的今天&#xff0c;生產數據庫變更管理、版本控制、數據使用是數據庫領域的核心挑戰之一。傳統的解決方式往往采用郵件或即時通訊工具發起審批流程&#xff0c;再通過堡壘機直連數…

離線服務器ollama新增qwen2:0.5b模型

離線服務器ollama新增qwen2:0.5b模型 Dify集成ollama前面已經介紹過離線服務器CentOS使用的docker安裝的ollama&#xff0c;其中在ollama中已經安裝了deepseek-r1:1.5b。目前的需求是需要再安裝一個qwen2:0.5b的模型&#xff0c;那么如何安裝呢&#xff1f; 1.首先在有網的服…

淺談StarRocks數據庫簡介及應用

StarRocks是一款高性能的實時分析型數據庫&#xff0c;專為復雜的SQL查詢提供極高的性能&#xff0c;尤其適用于數據分析場景。它是一款開源的新一代極速全場景MPP&#xff08;Massively Parallel Processing&#xff0c;大規模并行處理&#xff09;數據庫&#xff0c;致力于構…

Cadence學習筆記4

想到一個思路理解過程&#xff0c;記錄一下&#xff1a; 就是我在別的地方&#xff0c;前一天的那些 Lib 都不在了&#xff0c;突然發現自己好像就在 Cadence 中畫不了 PCB 了。這就引發了我思考在 Cadence 中如何進行繪制的一個整體的流程。 首先得有原理圖&#xff0c;那么原…

Linux--git

ok&#xff0c;我們今天來學習如何在Linux上建立鏈接git 版本控制器Git 不知道你?作或學習時&#xff0c;有沒有遇到這樣的情況&#xff1a;我們在編寫各種?檔時&#xff0c;為了防??檔丟失&#xff0c;更改 失誤&#xff0c;失誤后能恢復到原來的版本&#xff0c;不得不…

(七)Spring Boot學習——Redis使用

有部分內容是常用的&#xff0c;為了避免每次都查詢數據庫&#xff0c;將部分數據存入Redis。 一、 下載并安裝 Redis Windows 版的 Redis 官方已不再維護&#xff0c;你可以使用 微軟提供的 Redis for Windows 版本 或者 使用 WSL&#xff08;Windows Subsystem for Linux&a…

HarmonyOS NEXT 聲明式UI語法學習筆記-創建自定義組件

基礎語法概述 ArkTS的基本組成 裝飾器&#xff1a;用于裝飾類、結構、方法以及變量&#xff0c;并賦予其特殊含義。如上圖都是裝飾器&#xff0c;Component表示自定義組件&#xff0c;Entry表示表示自定義組件的入口組件&#xff0c;State表示組件中的狀態變量&#xff0c;當狀…

【ElasticSearch】學習筆記

一、lucene的組成 segment是一個具備完整搜索功能的最小單元。 多個segment組成了一個單機文本檢索庫lucene。 inverted index:倒排索引&#xff0c;用于快速根據關鍵詞找到對應的文章term index: 構建出關鍵詞的目錄樹&#xff0c;解決了term dictionary數據量過大&#xff…

SSL/TLS 1.2過程:Client端如何驗證服務端證書?

快速回顧非對稱加密和對稱加密 首先快速說一下非對稱加密和對稱加密。非對稱加密&#xff0c;就是有一個公鑰和私鑰(成對存在)。 公鑰對一段文本A加密得到文本B&#xff0c;只有對應的私鑰能對B解密得到A。 私鑰對一段文本C加密得到文本D&#xff0c;只有對應的公鑰能對D解密得…

ChatGPT、DeepSeek、Grok:AI 語言模型的差異與應用場景分析

&#x1f4dd;個人主頁&#x1f339;&#xff1a;一ge科研小菜雞-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 1. 引言 人工智能&#xff08;AI&#xff09;語言模型正在快速發展&#xff0c;ChatGPT&#xff08;OpenAI&#xff09;、DeepSe…

正點原子[第三期]Arm(iMX6U)Linux移植學習筆記-4 uboot目錄分析

前言&#xff1a; 本文是根據嗶哩嗶哩網站上“Arm(iMX6U)Linux系統移植和根文件系統構鍵篇”視頻的學習筆記&#xff0c;在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。 引用&#xff1a; …

matlab 控制系統GUI設計-PID控制超前滯后控制

1、內容簡介 matlab164-控制系統GUI設計-PID控制超前滯后控制 可以交流、咨詢、答疑 2、內容說明 略 3、仿真分析 略 4、參考論文 略

介紹HTTP協議基本結構與Linux中基本實現HTTPServer

介紹HTTP協議基本結構與基本實現HTTPServer HTTP協議 前面已經了解了協議的重要性并且已經定義了屬于我們自己的協議&#xff0c;但是在網絡中&#xff0c;已經有一些成熟的協議&#xff0c;最常用的就是HTTP協議 在互聯網世界中&#xff0c;HTTP&#xff08;HyperText Tran…

Linux和RTOS簡析

以下是針對 Linux驅動開發、RTOS&#xff08;實時操作系統&#xff09;任務狀態&#xff08;就緒態&#xff09; 以及 互斥鎖 的詳細解釋&#xff1a; 一、Linux設備驅動 1. 什么是設備驅動&#xff1f; 定義&#xff1a;設備驅動是操作系統內核的一部分&#xff0c;用于管理…

docker 常用命令大全(二),docker 鏡像操作 ,持續更新

docker 相關的命令 在公共倉庫中下載 docker pull bitnami/postgresql:12.8.0查看鏡像 docker images |grep postgresql打tag推送到本地倉庫 docker tag postgresql:12.8.0 docker.公司域名.com/library/postgresql:12.8.0推送到本地倉庫 docker push docker.公司域名com…

Git使用和原理(3)

1.遠程操作 1.1分布式版本控制系統 我們?前所說的所有內容&#xff08;?作區&#xff0c;暫存區&#xff0c;版本庫等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的筆記本或者 計算機上。?我們的 Git 其實是分布式版本控制系統&#xff01;什么意思呢&a…

[本周五題]Javascript面試常考題手撕場景UR緩存、new關鍵字、大數相加、最長遞增子序列、高并發請求、大文件上傳和WebWorks

LUR緩存實現 以下是 JavaScript 實現 LRU 緩存的詳細解析&#xff0c;結合核心原理與代碼實現&#xff0c;并標注來源&#xff1a; 一、LRU 緩存核心原理 LRU&#xff08;Least Recently Used&#xff09;緩存淘汰策略的核心思想是&#xff1a;當緩存容量滿時&#xff0c;優先…

c語言zixue

該文主要是記錄我學習中遇到的一些重點、易出問題的內容 教材p16.17 先從一個簡單的例子開始吧 #include <stdio.h> //編譯預處理命令 int main() //程序的主函數 {printf("To C"); //輸出語句return 0; //返回語句 } #include <stdio.h>是編譯預…

卷積神經網絡(CNN)的主要架構

卷積神經網絡&#xff08;CNN, Convolutional Neural Networks&#xff09;是深度學習中最重要的模型之一&#xff0c;廣泛應用于計算機視覺、目標檢測、語義分割等任務。自 LeNet 誕生以來&#xff0c;CNN 結構經歷了多個重要發展階段&#xff0c;出現了許多經典架構&#xff…