Flutter 使用texture_rgba_renderer实现桌面端渲染视频

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

Flutter视频渲染系列

第一章 Android使用Texture渲染视频
第二章 Windows使用Texture渲染视频
第三章 Linux使用Texture渲染视频
第四章 全平台FFI+CustomPainter渲染视频
第五章 Windows使用Native窗口渲染视频
第六章 桌面端使用texture_rgba_renderer渲染视频(本章)



前言

前面几章介绍了flutter使用texture渲染视频的方法,但是有个问题就是在每个平台都需要写一套原生代码去创建texture,这样对于代码的维护是比较不利的。最好的方法应该是一套代码每个平台都能运行,笔者最近刚好找到了pub上对texture封装的插件,直接提供dart代码调用texture进行rgba的渲染,当然只支持桌面端,即Windows、Linux、Macos,但依然是很方便了。


一、如何实现

1、添加插件

插件的地址是https://pub-web.flutter-io.cn/packages/texture_rgba_renderer。我们直接在pubspec.yaml添加依赖即可。
依赖

texture_rgba_renderer: ^0.0.16

引用

import 'package:texture_rgba_renderer/texture_rgba_renderer.dart';

Flutter 使用texture_rgba_renderer实现桌面端渲染视频,flutter,音视频,flutter,音视频,dart,windows,linux

2、创建texture

定义一个全局插件对象

final _textureRgbaRendererPlugin = TextureRgbaRenderer();

创建texture,得到textureId

//textureId,使用ValueNotifier方便刷新界面
ValueNotifier<int> _textureId = ValueNotifier<int>(-1);
//参数为唯一标识符,使用当前对象this的hashCode。
 _textureId.value = await _textureRgbaRendererPlugin.createTexture(hashCode);

3、关联texture控件

//ValueListenableBuilder与ValueNotifier是配套使用的,方便界面刷新。
ValueListenableBuilder(
                      valueListenable: _textureId,
                      builder: (c, v, w) {
                        //关联textureId
                        return Texture(textureId: _textureId.value);
                      })),

4、写入bgra

数据格式为ffmpeg的AV_PIX_FMT_BGRA

//数据地址
int adress = msg[2];
//一行数据长度
int linesize = msg[3];
int width = msg[4];
int height = msg[5];
//将bgra数据写入texture
final ptr = await _textureRgbaRendererPlugin.getTexturePtr(hashCode);
Native.instance.onRgba(
	Pointer.fromAddress(ptr),
	Pointer.fromAddress(adress),
	height* linesize,
	width,
	height,
	linesize);

二、效果预览

基本的一个运行效果

Flutter 使用texture_rgba_renderer实现桌面端渲染视频,flutter,音视频,flutter,音视频,dart,windows,linux


三、问题分析

texture_rgba_renderer: 0.0.16,就目前的版本来看,cpu消耗比原生写texture要高不少。主要原因是在dart写入bgra数据时,插件底层先是拷贝了一次数据,然后对又数据进行第二次逐行扫描拷贝到新的缓冲区对齐数据,这些操作都是比较消耗cpu的,尤其是逐行扫描拷贝。


四、完整代码

https://download.csdn.net/download/u013113678/88124430
示例代码只有Windows、Linux的视频渲染。
注:texture_rgba_renderer: 0.0.16的性能不算特别好,请根据需求下载。


总结

以上就是今天要讲述的内容,使用texture_rgba_renderer实现视频渲染是笔者无意中发现的一个方法,本质也是texture,只是有人将其封装为了插件,很大程度上方便了使用,用于预览小的视频画面是完全可以的。文章来源地址https://www.toymoban.com/news/detail-617173.html

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

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

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

相关文章

  • Flutter 即将放弃 Html renderer ,你是否支持这个提议?

    在之前的《Flutter Web 的未来,Wasm Native 即将到来》 中我们知道,Flutter 通过推进 WasmGC 的落地来支持 Dart Native ,从而让 Flutter Web 在浏览器上实现原生的 Wasm Native 的支持, 这也是 Flutter Web 最终决定的技术路线,也就是 CanvasKit 才是Flutter Web 的未来 。 因为将 Flutter Widget 转化为

    2024年04月09日
    浏览(34)
  • 使用变量作为参数的CSS rgba()函数详解

    CSS的rgba()函数用于设置颜色值的透明度。在实际开发中,我们可能希望通过变量来动态设置颜色透明度,以实现更灵活的样式效果。本文将详细介绍如何在rgba()函数中使用变量作为参数,并提供丰富的示例代码,助你灵活控制元素的透明度。 rgba()函数是CSS3中的一种颜色函数

    2024年02月14日
    浏览(36)
  • flutter更新后[VERBOSE-2:FlutterDarwinContextMetalImpeller.mm(35)] Using the Impeller rendering backend,

     在更新Flutter 3.10.0 后编译项目出现上线这样的提示,原因是在Flutter 3.10.0后 iOS 默认使用开始使用 Impeller  。在 3.7 版本中 Impeller 就被引入用于未来替换 Skia ,Flutter 团队面对 Skia 上越来越多的问题无法有效快速推进,所以走上了自研 Impeller 的道路。关闭这个提示,只需把

    2024年02月07日
    浏览(34)
  • flutter报错Cannot hit test a render box that has never been laid out

    出现这个问题的原因可能是因为你把一个ListView或者GridView放到了一个没有设置大小的容器里面导致的,所以意思是不能渲染那一个没有布局过的容器。我这里遇到的错误是因为我把GridView放到了一个Container里面,并且我没有设置Container宽高。 就导致了那个错误: ======== Exce

    2024年01月19日
    浏览(30)
  • 使用纹理(Textures)

            当物体表面并非是纯色的时候,比如带波点,斑纹或者表面有刮痕或被裂纹等,这些效果该如何实现呢?         这里我们需要提到一个概念是贴图(Maps)。Maps是覆盖在游戏物体上的2D图片,用来设置表面的颜色、specularity或metalness、物理纹理或其他相关属性

    2024年02月11日
    浏览(31)
  • 【Flutter】Flutter 使用 fluttertoast 实现显示 Toast 消息

    【Flutter】Flutter 使用 fluttertoast 实现显示 Toast 消息 在这篇文章中,我将与你分享如何在 Flutter 项目中使用 fluttertoast 包来显示 Toast 消息。 Toast 是一个简短的、非模态的消息提示框,它可以在应用的前端显示,不会打断用户的操作。 fluttertoast 是一个非常受欢迎的 Flutter 包,用

    2024年02月06日
    浏览(28)
  • 【Flutter】Flutter 使用 table_calendar 实现自定义日历

    【Flutter】Flutter 使用 table_calendar 实现自定义日历 你好!今天我要为你介绍一个非常实用的 Flutter 日历组件—— table_calendar 。这个组件不仅功能强大、高度可定制,而且使用起来非常简单。在本文中,我会手把手教你如何使用这个组件,并分享一些实际业务中的应用示例。希

    2024年02月08日
    浏览(32)
  • 【Flutter】Flutter 使用 fluent_ui 实现 Windows UI

    当然,我们将按照你的要求分批次输出文章的正文内容。以下是前三个章节的内容: fluent_ui 是一个在 Flutter 中实现 Windows UI 的包。通过使用这个包,开发者可以轻松地在 Flutter 项目中创建出符合 Windows UI 指南的应用程序。本文将详细介绍 fluent_ui 的主要特性和使用方法,帮助

    2024年02月09日
    浏览(34)
  • Flutter使用stack来实现悬浮UI

    在Flutter中,你可以使用Stack和Positioned来创建悬浮 UI。Stack允许你将多个小部件叠放在一起,而Positioned则用于定位小部件在Stack中的位置。 以下是一个简单的示例,演示如何创建一个悬浮按钮: 在这个例子中,MyFloatingUI是一个StatefulWidget,它包含一个Stack,其中包括了一个主要

    2024年01月25日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包