flutter 视频解码器fijkplayer使用

2023-11-15

       本人做视频监控项目的时候,需要去展示视频流到用户端,一开始使用flutter自带的VideoPlayer播放监控视频,一开始没有发现有什么问题,因为使用多的是Android模拟器,一直没有使用iso模拟器或者真机测试能不能播放,直到开发接近尾声,在ios模拟器上测试的时候发现了问题,视频流为H264的时候能正常播放,但是视频流为H265的时候一直转圈,模拟器和真机播放不了(Android模拟器和真机都是可以播放的)。后来就打算换一个三方插件来调整播放。

  1. 在pubspec.yaml导入引用的fijkplayer插件
     # 视频解码器 软解码
      fijkplayer: ^0.10.1
  2. 状态详解
    状态名 播放器表现
    idle 闲置状态,刚完成构造的 FijkPlayer 处于此状态。
    此状态下播放器占用少量内存,无额外线程启动。
    idle 状态只能通过 setDataSource 转换为 initialized 状态
    initialized 初始化完成状态,和 idle 状态相比,仅是多了输入媒体数据源的信息。 同样无额外线程打开。
    asyncPreparing 异步准备状态,在 initialized 状态调用 prepareAsync 到达此状态。
    这不是一个稳定状态,此状态等待特定任务完成后自动转化为 prepared 状态。
    这一状态的主要准备工作是 探测媒体文件类型,打开媒体文件,打开解码器以及新建解码线程,新建数据 read 线程,打开音频输出设备,新建视频输出线程等。
    prepared asyncPreparing 完成指定任务后自动转化为此状态。
    此状态下已经开始缓冲解码了一部分音视频数据,可以随时进行播放。
    started 媒体(视频、音频)正在播放中。
    paused 媒体(视频、音频)播放暂停。
    completed 媒体(视频、音频)播放完成。 可重新从头开始播放。
    stopped 播放器各种线程占用资源都已经释放。 音频设备关闭。
    end 播放器中所有需要手动释放的内存都释放完成。
    处于此状态的播放器只能等待垃圾回收进行内存释放。
    error 播放器出现错误。

  3. 简单使用代码如下
    import 'package:fijkplayer/fijkplayer.dart';
    import 'package:flutter/material.dart';
    
    class VideoScreen extends StatefulWidget {
      final String url;//视频地址
    
      VideoScreen({@required this.url});
    
      @override
      _VideoScreenState createState() => _VideoScreenState();
    }
    
    class _VideoScreenState extends State<VideoScreen> {
      final FijkPlayer player = FijkPlayer();
    
      _VideoScreenState();
    
      @override
      void initState() {
        super.initState();
        //传入视频地址,视频是否自动播放
        player.setDataSource(widget.url, autoPlay: true);
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(title: Text("视频监控")),
            body: Container(
              alignment: Alignment.center,
              child: FijkView(
                player: player,
              ),
            ));
      }
    
      @override
      void dispose() {
        super.dispose();
        player.release();
      }
    }
     
  4. 使用后能够正常播放,但是你发现UI界面太丑了,或者功能不够自己使用,需要更多的功能使用才行,别急!三方提供者早就想到了这里,所以提供了可以自己定的UI界面设置。需要修改panelBuilder更改UI界面,废话不多说,上代码。 首先加入自定的UI界面代码
    class CustomFijkPanel extends StatefulWidget {
      final FijkPlayer player;
      final BuildContext buildContext;
      final Size viewSize;
      final Rect texturePos;
    
      const CustomFijkPanel({
        @required this.player,
        this.buildContext,
        this.viewSize,
        this.texturePos,
      });
    
      @override
      _CustomFijkPanelState createState() => _CustomFijkPanelState();
    }
    
    class _CustomFijkPanelState extends State<CustomFijkPanel> {
    
      FijkPlayer get player => widget.player;
      bool _playing = false;
    
      @override
      void initState() {
        super.initState();
        widget.player.addListener(_playerValueChanged);
      }
    
      void _playerValueChanged() {
        FijkValue value = player.value;
    
        bool playing = (value.state == FijkState.started);
        if (playing != _playing) {
          setState(() {
            _playing = playing;
          });
        }
      }
    
      @override
      Widget build(BuildContext context) {
        Rect rect = Rect.fromLTRB(
            max(0.0, widget.texturePos.left),
            max(0.0, widget.texturePos.top),
            min(widget.viewSize.width, widget.texturePos.right),
            min(widget.viewSize.height, widget.texturePos.bottom));
    
        return Positioned.fromRect(
          rect: rect,
          child: Container(
            alignment: Alignment.bottomLeft,
            child: IconButton(
              icon: Icon(
                _playing ? Icons.pause : Icons.play_arrow,
                color: Colors.white,
              ),
              onPressed: () {
                _playing ? widget.player.pause() : widget.player.start();
              },
            ),
          ),
        );
      }
    
      @override
      void dispose() {
        super.dispose();
        player.removeListener(_playerValueChanged);
      }
    }

        这里是使用时候的代码

FijkView(
  player: player,
  panelBuilder: (FijkPlayer player, FijkData data, BuildContext context, Size viewSize, Rect texturePos) {
    return CustomFijkPanel(
      player: player,
      buildContext: context,
      viewSize: viewSize,
      texturePos: texturePos);
  },
)

到这里就完成了,简单使用、自定义使用,如果还需要看详细信息,可参考他们提供的官方文档,地址如下:fijkplayer -- Flutter plugin for ijkplayer - fijkplayer -- Flutter plugin for ijkplayer

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter 视频解码器fijkplayer使用 的相关文章

  • 如何使用 SingleChildScrollView 使 Stacklayout 可滚动?

    我正在尝试使用 SingleChildScrollView 使堆栈布局可滚动 但它不滚动 这里应该使用SingleChildScrollView吗 我想我已经给出了足够的描述 可以让任何人理解我的问题 这里有更多文本以满足 StackOve
  • flutter run 无法在 iOS 模拟器上运行,但 Xcode 可以构建

    在我的 Flutter 项目中 flutter run命令无法将项目构建到 iOS 模拟器 但在 Xcode 中 当我单击构建按钮时 Xcode 可以毫无问题地构建它 我正在使用 AgoraRTC 库 添加 Flutter Quill 后就
  • 颤动中的单选按钮对齐

    我是颤振的新手 我想对齐单选按钮 即 无论文本是什么 单选按钮都应该按列对齐 我在用Column然后小部件Row其中的小部件但得到以下结果 代码在这里 Widget build BuildContext context return Con
  • 对于哪些 flutter 小部件我们需要使用 const?

    我了解的好处const并且小部件不会在状态更改时重建 但当您看到下面的代码时 仍然很明显它们是常量 我希望 flutter 自动处理它 或者 flutter 已经在处理它而我却没有意识到 This makes sense to me but
  • 在 main.dart 中使用 FutureBuilder

    下面的代码总是显示 OnboardingScreen 一段时间 可能是几毫秒 然后显示 MyHomePage 我相信你们都明白我想做什么 我正在使用 FutureBuilder 来检查 getString 方法是否有数据 我有什么错 或者还
  • 如何在 Flutter/Dart 中使用带有基类的 Provider

    我有这样的基类和派生类 abstract class A extends ChangeNotifier class B extends A 我正在使用这样的提供者 ChangeNotifierProvider b create contex
  • 父数据小部件使用不正确。扩展的小部件必须放置在弹性小部件内

    我收到以下错误 即 抛出了另一个异常 ParentDataWidget 的使用不正确 在移动屏幕上显示错误 override Widget build BuildContext context return MaterialApp titl
  • 渲染时 Flutter SVG 延迟

    我在行中显示 SVG 文件形式的图像和文本 由于某些原因 svg 图像的渲染速度比屏幕的其余部分慢 从而导致延迟 这不利于用户体验 这种延迟正常吗 我该怎么做才能使整个屏幕同时渲染 Row mainAxisAlignment MainAxi
  • 如何在列表视图中滚动添加更多项目?

    这里的代码当前加载了存储在 Firestore 集合中的所有啤酒 我如何最初只加载 10 个啤酒 然后当用户向下滚动并到达 10 个啤酒列表的末尾时 它应该加载最后一次酿造后还有 10 杯 并且酿造应根据时间戳进行排序 class Brew
  • 由于 mapEventToState 不起作用而引起的 Flutter 块迁移

    我正在关注移民 https bloclibrary dev migration id packagebloc 1到新的块 8 0 0 我正在尝试删除映射事件到状态但我这样做有困难 你能帮我看看该怎么做吗 我已经在下面尝试过 但它不起作用 旧
  • Android Studio Flutter 项目错误:内存不足

    我在 Android Studio 上运行任何 flutter 项目 都会抛出内存不足错误 控制台中显示的消息如下所示 e b build slave windows engine build src third party dart ru
  • 哪些 Flutter 插件或功能可以利用外部 iOS/Android 显示器来显示与主显示器不同的内容

    我正在构建一个跨平台应用程序 需要在外部显示器上显示不同的视图 通常通过连接到 LCD 投影仪的 HDMI 适配器电缆连接 Flutter 是否能够在内置的外部显示器上显示不同的屏幕 在现有的 Flutter 插件中还是使用现有的 Flut
  • 类型“Future”不是类型转换中“List”类型的子类型

    我试图从我的 Firestore 中获取确定集合中的所有文档 之后 我想将它们设置在文档列表中 列表的每个位置代表一个文档 但是 当我编写代码时 我收到此错误 类型 Future 不是类型转换中类型 List 的子类型 import pac
  • Flutter Web 平台检查

    我正在尝试找到一种方法来查看我的 flutter web 项目正在哪个平台 iOS 或 Android 上运行 当我使用if Platform isIOS do something 我面临以下错误 Error Unsupported ope
  • 空安全 AppLocalization 字符串的最佳方法

    Question 我在用AppLocalizations of context myString在我的 null safe flutter 应用程序中国际化字符串 我的 IDE 告诉我AppLocalizations of context
  • 颤动:所选值不显示在下拉列表中

    我正在从 SQLite 数据库填充城市名称并尝试显示为下拉列表 我通过遵循教程使其工作 但遇到了一个小问题 所选值不会显示在下拉列表中 它继续显示默认提示值 但是 我能够分配和检索正确的选定值 这是我的代码 cities dart clas
  • 将 SQL Server 与 Dart 结合使用

    我还没有找到很好的答案 所以我想尝试一下得到答案 将 Microsoft SQL Server 与 Dart 结合使用的最佳方式是什么 我需要它能够从基本上任何操作系统 网络和移动设备上使用它 我觉得最好的方法可能是 GraphQL 但我对
  • 如何在Flutter中获取ScrollView中的子滚动偏移位置

    我制作了一个 CustomScrollView 小部件 其中包含 银应用栏 Sliver持久标头 银格 Sliver持久标头 银格 SliverPercientHeader 将是 SliverGrid 中项目的描述 一旦点击 我用 Gest
  • Flutter:带有嵌套导航的底部导航栏,并在选项卡更改时恢复根页面

    我是 Flutter 开发的新手 我已经阅读了多个教程来了解底部导航栏 我已经尝试过这些教程 但无法达到我的要求 我遵循的教程 https codewithandrea com articles multiple navigators bo
  • Flutter 中有预填充数据库使用的示例吗?

    Flutter 中有预填充数据库使用的示例吗 我不需要 CRUD 示例 此时我只需要从数据库读取数据即可 我是 Flutter 新手 所以一步一步的教程会很好 您可以将您的应用程序与预填充的 sqlite 数据库捆绑在一起assets文件夹

随机推荐

  • 区块链技术通俗讲解_要了解区块链一定要清楚区块链技术的几点技术原理

    关注 区链数科 让你从入门到精通区块链 其实 区块链并不是一个新型的技术 更多的应该是传统技术上的一个融合 再通过一定的规则和机制去实现了区块链独特性质 我们前面主要普及一些关于区块链的基本概念以及市场概况 今天来讲讲区块链的技术原理 希望
  • 使用pandas groupby的一个案例

    mongodb中有下面一组数据 业务场景就不介绍了 看数据应该很好理解 id 606fdd0805f5710008a82223 brand id 1 brand name APPLE series id 11 series name iPh
  • jdbc连接Microsoft SQL Server 2014

    前言 多年不用Microsoft SQL Server 简单回顾一下并记录一下在java中连接SQL Server的过程和注意事项 首先 从下载Driver开始 Microsoft JDBC Drivers 官方的下载地址为 适用于 SQL
  • 一些方便记忆的小例子

    epoll和select的小例子 先看一下epoll和select的区别 对于select来说 所有文件描述符都是在用户态被加入其文件描述符集合的 每次调用都需要将整个集合拷贝到内核态 epoll则将整个文件描述符集合维护在内核态 每次添加
  • Zookeeper缩容5缩3操作记录(二)

    测试目标 测试5台缩3台zk 先shutdown 一台5 再将1 2 3配置修改为1 2 3 逐一重启 是否会发生脑裂 测试过程 准备1 2 3 4 5 五台 3为leader 将5 shutdown 1 将1配置修改为1 2 3 重启 结
  • R语言之 删除重复数据

    这篇主要介绍如何在R中识别和删除重复数据 主要用的到R base和dplyr函数 duplicated 用于识别重复的元素和 unique 用于提取唯一元素 distinct dplyr package 删除数据框中的重复行 x lt c
  • Java:Immutable Patterns

    版权所有 2022 涂聚文有限公司 许可信息查看 描述 不变模式 Immutable Patterns 历史版本 JDK 14 02 2022 09 12 创建者 geovindu 2022 09 12 添加 Lambda 2022 09
  • 四旋翼无人机Matlab建模

    本文主要分享一下四旋翼无人机的建模过程 然后在Matlab的simulink模块搭建起四旋翼无人机的模型 本篇文章主要参考了康日晖的 四旋翼无人机建模 与南京邮电大学周帆同学的硕士毕业论文 最后我会给出参考文章网址 有兴趣的同学可以看看 一
  • 8、2D建筑与3D模型的遮挡问题 URP Shader

    在我们的实际项目中根据实际情况 我们的建筑采用了2D面片的方式 但因为我们的英雄是3D模型 同时策划有需求 英雄可以在主城里面走动 这个时候就给我们提出了一个比较麻烦的问题 我们知道正常情况下渲染是谁的渲染队列高谁渲染在上面 我们这里英雄的
  • WPF 控件库Live Charts 动态折线图

    Live Charts库安装通过 1 PM gt Install Package LiveCharts Wpf 2 通过Nuget搜索添加LiveCharts Wpf安装 WPF页面xaml
  • oracle 去除oracle字段值得tab格

    大家都知道oracle中去掉左右空格用trim 函数 单独去左空格用ltrim 去右空格用rtrim 偶尔大家从excel中复制粘贴到数据空中的数据有可能左右会存在空格或者tab 此时可以用以下语句对所有存有字段的tab进行更新update
  • linux 下 systemd-udevd 服务解析

    最近在看linux下重定向的时候看到 的这个系统的服务 所以记下来备忘 描述 systemd udevd是监听内核发出的设备事件 并根据udev规则处理每个事件 选项 daemon 脱离控制台 并作为后台守程运行 debug 在标准错误上打
  • linux shell $0怎么输出,linux shell中$0,$?,$!等的特殊用法

    一 Shell脚本中 0 等的意义说明 1 Shell本身的PID ProcessID 即脚本运行的当前进程ID号 2 Shell最后运行的后台Process的PID 后台运行的最后一个进程的 进程ID号 3 最后运行的命令的结束代码 返回
  • 【IT项目管理】第八章课后作业

    1 制定的聘用的质量标准清单如下 标准编号 标准名称 标准内容 1 年龄 30岁以上 2 学历 博士学位 3 研究成果 至少在省级以上刊物发表文章 4 工作经验 具有2年以上教师从业经验 5 项目经历 至少主持或参与省级基金项目 2 制作E
  • 【网络原理篇2】TCP报头详解

    在这一篇文章当中 了解到TCP是属于传输层的协议 当数据从应用层向传输层发送的时候 如果使用的是TCP协议 那么就需要把应用层的数据加上TCP报头 初识网络 IP 端口 网络协议 TCP IP五层模型 革凡成圣211的博客 CSDN博客TC
  • Python 调用海康机器人工业相机

    一 前期准备 1 python环境搭建 2 安装MVS软件 3 网上博客参考 1 RTSP Runtime Stream Protocol 协议方向 很遗憾 此路不通 因为我们用的 海康机器人工业相机 MV CU060 10GM 这款相机
  • builtin descriptor types

    inspect getattr static obj attr default None Retrieve attributes without triggering dynamic lookup via the descriptor pr
  • 基于深度学习的微表情识别系统(Python代码+PyqtUI界面,可以实现图像识别和视频识别,有详细中文注释)

    1 效果视频 基于深度学习的微表情识别系统 Python代码 PyqtUI界面 可以实现图像识别和视频识别 有详细中文注释 哔哩哔哩 bilibili 2 数据集介绍 包括7种类别微表情 anger文件夹 3995张 disgust文件夹
  • 操作系统8-死锁和进程通信----(库函数scanf和printf是基于管道读写实现的!

    大纲 死锁概念及死锁处理方法 银行家算法 死锁检测 进程通信方法 信号 管道 消息队列 共享内存 一 死锁 背景 可重用资源 资源不能被删除且任何时刻只能有一个进程使用 进程释放资源后其他进程可重用 可能出现死锁 消耗资源 资源创建和销毁
  • flutter 视频解码器fijkplayer使用

    本人做视频监控项目的时候 需要去展示视频流到用户端 一开始使用flutter自带的VideoPlayer播放监控视频 一开始没有发现有什么问题 因为使用多的是Android模拟器 一直没有使用iso模拟器或者真机测试能不能播放 直到开发接近