草庐IT

Flutter 中视频的播放

nicepainkiller 2023-05-26 原文

前言:在 flutter 中播放视频,并且可以控制视频的播放!(或者是预览)

 

视频播放插件video_player但是没有视频控制 UI,这边想实现的效果有点类似 微信里面观看视频的效果; 本来是有个插件的 chewie,但是用了下 感觉过于繁琐;下面手写一个 视频 播放控件主要功能有:

  • 视频播放 /视频暂停
  • 视频进度条, 可以随意跳到指定位置

 

参考:Flutter自定义视频播放器(播放、暂停、倍速、拖动视频进度)_就是三木啊的博客-CSDN博客_flutter播放器Flutter自定义视频播放器在pubspec.yaml 添加video_player、dropdown_button2添加完成后在需要视频的dart文件引入import 'package:video_player/video_player.dart';import 'package:dropdown_button2/dropdown_button2.dart';具体代码//定义一个VideoPlayerControllervar _videoPlayerController;//监听视https://blog.csdn.net/weixin_43783419/article/details/124661562?spm=1001.2101.3001.6650.16&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-16-124661562-blog-123168999.pc_relevant_sortByAnswer&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-16-124661562-blog-123168999.pc_relevant_sortByAnswer&utm_relevant_index=21

 效果如下:

pubspec.yaml

添加配置:主要用于视频的播放

video_player: 2.3.0

 

page_preview_video.dart 

界面显示 布局: 

import 'package:examine/utils/app_navigation.dart';
import 'package:examine/utils/app_screen.dart';
import 'package:examine/wrap/extension/extension.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

class PagePreviewVideo extends StatefulWidget {
  final String url;
  const PagePreviewVideo({Key? key, required this.url}) : super(key: key);

  @override
  _PagePreviewVideoState createState() => _PagePreviewVideoState();
}

class _PagePreviewVideoState extends State<PagePreviewVideo> {
  VideoPlayerController? _videoPlayerController;
  bool _isPlaying = false;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _videoPlayerController = VideoPlayerController.network(widget.url)
      ..initialize().then((_) {
        _videoPlayerController!.play();
        setState(() {});
      });

    _videoPlayerController!.addListener(() {
      setState(() {
        _isPlaying = _videoPlayerController!.value.isPlaying;
      });
    });
  }

  @override
  void dispose() {
    _videoPlayerController?.dispose();
    // TODO: implement dispose
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: Stack(
        children: [
          _videoPlayerController!.value.isInitialized
              ? Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    InkWell(
                      onTap: () {
                        if (_isPlaying) {
                          _videoPlayerController!.pause();
                        }
                      },
                      child: Container(
                        constraints:
                            BoxConstraints(maxWidth: 0.85 * AppScreen.height),
                        child: AspectRatio(
                          aspectRatio:
                              _videoPlayerController!.value.aspectRatio,
                          child: VideoPlayer(_videoPlayerController!),
                        ),
                      ),
                    ),
                    SliderTheme(
                      data: SliderTheme.of(context).copyWith(
                        activeTrackColor:
                            Colors.white.withOpacity(0.5), //进度条滑块左边颜色
                        inactiveTrackColor:
                            Colors.white.withOpacity(0.2), //进度条滑块右边颜色
                        thumbColor: Colors.transparent, //滑块颜色
                        overlayColor: Colors.transparent, //滑块拖拽时外圈的颜色
                        trackHeight: 4.cale, //进度条宽度
                        // trackShape: RoundSliderTrackShape(
                        //     radius: 10), //进度条形状,这边自定义两头显示圆角
                      ),
                      child: Slider(
                        max: _videoPlayerController!
                            .value.duration.inMilliseconds
                            .truncateToDouble(),
                        value: _videoPlayerController!
                            .value.position.inMilliseconds
                            .truncateToDouble(),
                        // activeColor: Colors.white.withOpacity(0.5),
                        // inactiveColor: Colors.black.withOpacity(0.5),
                        onChanged: (double value) {
                          _videoPlayerController!.seekTo(
                            Duration(
                              milliseconds: value.truncate(),
                            ),
                          );
                        },
                      ),
                    ),
                  ],
                )
              : Center(
                  child: CircularProgressIndicator(
                    valueColor:
                        AlwaysStoppedAnimation(Colors.white.withOpacity(0.7)),
                    backgroundColor: Colors.white.withOpacity(0.4),
                  ),
                ),
          Positioned(
            left: 30.cale,
            top: 100.cale,
            child: InkWell(
              onTap: () {
                AppNavigator().navigateBack();
              },
              child: Icon(
                Icons.cancel,
                color: Colors.white,
                size: 55.cale,
              ),
            ),
          ),
          if (_videoPlayerController!.value.isInitialized && !_isPlaying)
            Center(
              child: GestureDetector(
                onTap: () {
                  _videoPlayerController!.play();
                },
                child: Center(
                  child: Icon(
                    Icons.play_circle_fill_outlined,
                    color: Colors.white,
                    size: 120.cale,
                  ),
                ),
              ),
            )
        ],
      ),
    );
  }
}

调用:

AppNavigator().navigateTo(
    PagePreviewVideo(url: _videoPreview()[index]));

有关Flutter 中视频的播放的更多相关文章

  1. ruby - 如何以编程方式将 mp3 转换为 itunes 可播放的 aac/m4a 文件? - 2

    我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。

  2. ruby - 如何播放 mp3 文件? - 2

    我如何用ruby​​编写一个脚本,当从命令行执行时播放mp3文件(背景音乐)?我试过了run="mplayer#{"/Users/bhushan/resume/m.mp3"}-aosdl-vox11-framedrop-cache16384-cache-min20/100"system(run)但它也不起作用,以上是播放器特定的。如果用户没有安装mplayer怎么办。有没有更好的办法? 最佳答案 我一般都是这样pid=fork{exec'mpg123','-q',file} 关于ruby

  3. Flutter 环境变量配置和flutter doctor中的错误解决 - 2

    一、环境变量右键点击我的电脑-属性:然后找到环境变量 1.Android的SDK不在C盘的话需要额外配这个到用户环境变量:ANDROID_HOMED:\AndroidSDK2.然后在系统变量:Path中添加一条这样的值        D:\Flutter\flutter\bin             这个值写flutter包解压的实际地址即可 3.在系统变量中添加两个镜像变量:        变量名:FLUTTER_STORAGE_BASE_URL      变量值:https://storage.flutter-io.cn        变量名:PUB_HOSTED_URL      变量

  4. ruby 声音播放 - 2

    这是2009年,早在2001年左右,ruby中的声音播放就没有好的绑定(bind)。有变化吗?我正在寻找可以控制原始声音或mp3、ogg和flac播放的东西。我的谷歌搜索已经枯竭。编辑:Linux、OSX,如果可能的话还有Windows。 最佳答案 您没有提到平台。Thispage描述了win32-sound库,它似乎至少支持WAV播放。对于一个更加平台中立的方式,Ruby/SDL为广受欢迎的SDL提供绑定(bind)图书馆。 关于ruby声音播放,我们在StackOverflow上找到

  5. 《安富莱嵌入式周报》第301期:ThreadX老大离开微软推出PX5 RTOS第5代系统,支持回流焊的自焊接PCB板设计,单色屏实现多级灰度播放视频效果 - 2

    往期周报汇总地址:嵌入式周报-uCOS&uCGUI&emWin&embOS&TouchGFX&ThreadX-硬汉嵌入式论坛-PoweredbyDiscuz! 祝大家开工大吉视频版:https://www.bilibili.com/video/BV1GT411o7zr1、ThreadX老大离开微软,开发的第5代RTOS系统PX5RTOS正式上线最早是看到IAR的一条消息,全面支持PX5RTOS,然后就进一步上他们的官方下载白皮书了解相关消息当看到这两个名字时,很熟悉,这不就是ThreadX的老大BillLamie。 经过信息检索,应该是实锤了,领英上已经更新了他的工作经历: 然后再结合Azur

  6. javascript - 在 MediaSource HTML5 中播放 MediaRecorder block ——视频卡住 - 2

    我有这个简单的代码来获取视频流block并在MediaSource中播放它们。我看到视频,但有时它会停止。它可能会工作几秒钟或几分钟。但最后它在某个时刻停止了。chrome://media-internals/显示没有错误。这里有什么问题吗?navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia;varmediaSource=newMediaSource();varconstraints

  7. javascript - 使用 js/jquery 检测 flash 播放器的现代或非弃用方法? - 2

    首先,很抱歉在这里重新提出这个问题。我已经尝试了两天如何使用javascript/jquery完成这项工作,我想我已经阅读了所有堆栈溢出和其他关于此的博客文章,所以请不要将其标记为重复,因为我无法使用2012年到2017年的过时脚本。我有一个页面重定向到第三方电子学习平台,其中一些内容需要flash才能工作。许多用户不关心他们的机器上安装了哪些软件(多么新,呵呵)所以我需要检测它并显示典型消息“请单击此处安装/更新FlashPlayer”,但我找不到“现代"执行此操作的脚本/方式,在任何地方,尽可能简化。我尝试过的所有脚本都已弃用或在所有浏览器中返回false,即使我安装并激活了最新版

  8. javascript - 声音播放/停止/暂停 - 2

    我正在开发一个可靠的JavaScript库。我可以用下面的代码播放声音。varsoundPlayer=null;functionplaySound(){soundPlayer=newAudio(soundName).play();}如何停止和暂停此音频?当我这样尝试时:soundPlayer.pause();或者soundPlayer.stop();但是我得到这个错误:UncaughtTypeError:soundPlayer.stopisnotafunction我该怎么做? 最佳答案 如果你改变它:soundPlayer=newA

  9. javascript - 在 SO 聊天中播放提示音 - 2

    我正在尝试使用Chrome扩展程序在SO聊天中播放通知提示音(或提及提示音),但我无法正确播放(如果可能的话)。我尝试了以下代码:this.notify=function(){$("#jplayer").jPlayer('play',0);}但是我得到以下错误:UncaughtTypeError:Object[objectObject]hasnomethod'jPlayer'有没有办法使用SO聊天声音“模块”/播放器来播放@mention提示音?更新我知道我可以设置自己的“音频播放器”,但我想使用SO上聊天中使用的音频播放器,并且我想使用通知提示音。我已经在GitHubgist中上传了

  10. javascript - 视频播放完成后如何显示灯箱? - 2

    我有一个youtube视频。我想在停止播放时显示一个灯箱。我需要使用javascript/jQuery或PHP来完成此操作。Ajax也很好。我寻找了一种解决方案,但没有找到有效的解决方案。 最佳答案 如果你可以使用youtubeapi,那么像这样的东西应该可以工作:$(document).ready(function(){varplayer;functiononYouTubePlayerAPIReady(){player=newYT.Player('player',{height:'390',width:'640',videoId:

随机推荐