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使用 的相关文章

随机推荐

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

    关注 区链数科 让你从入门到精通区块链 其实 区块链并不是一个新型的技术 更多的应该是传统技术上的一个融合 再通过一定的规则和机制去实现了区块链独特性质 我们前面主要普及一些关于区块链的基本概念以及市场概况 今天来讲讲区块链的技术原理 希望
  • 使用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模拟器或者真机测试能不能播放 直到开发接近