flutter 视频解码器fijkplayer使用

这篇具有很好参考价值的文章主要介绍了flutter 视频解码器fijkplayer使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       本人做视频监控项目的时候,需要去展示视频流到用户端,一开始使用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文章来源地址https://www.toymoban.com/news/detail-409500.html

到了这里,关于flutter 视频解码器fijkplayer使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用AutoDecoder自动解码器实现简单MNIST特征向量提取

    自动解码器(AD)是论文\\\"DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation\\\" 中使用的一种方法,与传统编码-解码结构不同,AD无编码器,仅有一个解码器。 解码器实现特征向量(隐向量)与图片之间的转换 。 在训练过程中 同时优化 特征向量与神经网络参数。如

    2024年02月02日
    浏览(48)
  • Qt6 QMediaPlayer播放视频没有声音或者无法播放声音报错handleSourceError: 0x8007007B解决方法(无需下载解码器)

    Qt5到Qt6时变动了许多类QMediaPlayer也在其中。曾经只需要这样即可播放视频。 而如今需要这样 这样写完后运行,发现视频可以播放了,但是发现了个问题,播放的视频没有声音。打开浏览器搜索,发现好像没有类似问题的文章。至少笔者没找到太多类似的。有也是大部分都是

    2024年02月13日
    浏览(82)
  • 解码器 | 基于 Transformers 的编码器-解码器模型

    基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外,建议读者对 自注意力 (self-attention) 架构 有一个基本了解

    2024年02月08日
    浏览(51)
  • 利用第三方解码器ffmpeg让群晖DSM6.2.4版本的Video Station支持DTS视频编码和EAC3音频编码

    截至2022年5月6日,此方法可用! 本文章可以解决群晖版本6.2.4-25556 Update5(Video Station版本2.5.0-1656)在播放dts、eac3音频编码的视频时提示不支持的问题。 对于群晖6.2.3版本,Video Station版本2.4.9,网上随便搜的方法都可以使用,但是用在6.2.4未必可行。原因在于Video Station版本2

    2023年04月08日
    浏览(42)
  • Netty编解码器,Netty自定义编解码器解决粘包拆包问题,Netty编解码器的执行过程详解

    当Netty发送或者接收一个消息的时候,就会发生一次数据转换。入站消息会被解码(从字节转换为另一种格式,比如java对象);出站消息会被编码成字节。 Netty 提供一系列实用的编解码器,他们都实现了 ChannelInboundHadnler 或者 ChannelOutboundHandler 接口。在这些类中,channelRead 方

    2023年04月23日
    浏览(45)
  • 【计算机视觉 | 目标检测】术语理解9:AIGC的理解,对比学习,解码器,Mask解码器,耦合蒸馏,半耦合,图像编码器和组合解码器的耦合优化

    AIGC指的是使用人工智能技术自动生成的各类数字内容,包括文本、图像、音频、视频等。它利用机器学习模型进行智能化内容生成。 主要的技术手段包括: 自然语言生成(NLG):使用RNN、GPT等语言模型生成文本。 生成对抗网络(GAN):使用GAN生成高质量图片。 自动语音合成(TTS):使用

    2024年02月04日
    浏览(70)
  • 编码器 | 基于 Transformers 的编码器-解码器模型

    基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外,建议读者对 自注意力 (self-attention) 架构 有一个基本了解

    2024年02月08日
    浏览(64)
  • 【Transformer系列(1)】encoder(编码器)和decoder(解码器)

    前言 这个专栏我们开始学习transformer,自推出以来transformer在深度学习中占有重要地位,不仅在NLP领域,在CV领域中也被广泛应用,尤其是2021年,transformer在CV领域可谓大杀四方。 在论文的学习之前,我们先来介绍一些专业术语。本篇就让我们先来认识一下encoder和decoder吧!

    2024年03月25日
    浏览(66)
  • 22.Netty源码之解码器

    https://mp.weixin.qq.com/s/526p5f9fgtZu7yYq5j7LiQ Netty 常用解码器类型: ByteToMessageDecoder/ReplayingDecoder 将字节流解码为消息对象; MessageToMessageDecoder 将一种消息类型解码为另外一种消息类型。 自定义一次解码器ByteToMessageDecoder解码器,如果读到的字节大小为4,那么认为读取到了1个完整的数

    2024年02月14日
    浏览(49)
  • 【Netty】Netty 解码器(十二)

    回顾Netty系列文章: Netty 概述(一) Netty 架构设计(二) Netty Channel 概述(三) Netty ChannelHandler(四) ChannelPipeline源码分析(五) 字节缓冲区 ByteBuf (六)(上) 字节缓冲区 ByteBuf(七)(下) Netty 如何实现零拷贝(八) Netty 程序引导类(九) Reactor 模型(十) 工作原理

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包