当前位置: 首页 > news >正文

Flutter 使用ffigen生成ffmpeg的dart接口

Flutter视频渲染系列

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


文章目录

  • Flutter视频渲染系列
  • 前言
  • 一、如何实现
    • 1、添加ffigen插件
    • 2、创建ffigen.yaml
    • 3、ffigen命令生成dart代码
    • 4、关联ffmpeg库
  • 二、制作成插件
  • 三、使用示例
    • 1、添加插件
    • 2、调用ffmpeg
  • 总结


前言

前面几章介绍了flutter各种视频渲染的方法,视频渲染前显然是需要先获取视频流并解码,这些操作就需要用到ffmpeg,前面的几章的解码都是通过c语言调用ffmpeg,再将数据传输到dart渲染的。本章将提供一种生成ffmpeg dart接口的方法,直接用dart就可以调用ffmpeg进行拉流并解码然后显示。


一、如何实现

1、添加ffigen插件

插件的地址是https://pub-web.flutter-io.cn/packages/ffigen。我们直接在pubspec.yaml添加依赖即可。
依赖。ffigen不是运行库,是一个开发工具,通过执行命令来生成dart代码,所以放在dev_dependencies即可。

ffigen: ^12.0.0

在这里插入图片描述

2、创建ffigen.yaml

创建一个yaml文件用于指定需要生成的头文件以及生成的对象名称等信息。ffigen.yaml的用法查看插件官网:https://pub-web.flutter-io.cn/packages/ffigen
在这里插入图片描述
编写生成信息,需要指定头文件、过滤规则、以及名称转换规则

#usage:cmdline "dart run ffigen --config ffmpeg_ffigen.yaml"  see more:https://pub-web.flutter-io.cn/packages/ffigen
name: FFmpegAutoGen#生成的dart类名
output:bindings: "lib/ffmpeg/ffmpeg_auto_gen.dart"#生成的dart文件路径
headers:entry-points:#需要生成dart代码的ffmpeg头文件- "ffi/sdk/include/libavcodec/avcodec.h"#其他ffmpeg头文件略include-directives:- "**.**"
compiler-opts:- "-I ffi/sdk/include"
#名称过滤规则略
#名称转换规则略

3、ffigen命令生成dart代码

ffmpeg_ffigen.yaml所在目录,命令行在执行。需要安装lvvm,不同平台具体查看https://pub-web.flutter-io.cn/packages/ffigen

dart run ffigen --config ffmpeg_ffigen.yaml

生成的dart文件
在这里插入图片描述
生成的dart代码
在这里插入图片描述

4、关联ffmpeg库

新建一个ff.dart文件,将上述步骤生成代码与ffmpeg库关联起来,下列是ffmpeg4.x的示例。

import 'dart:ffi';
import 'dart:io';
import 'package:ffmpeg_interface/ffmpeg/ffmpeg_auto_gen.dart';
import 'package:ffi/ffi.dart';List<DynamicLibrary> _libs4 = [DynamicLibrary.open(Platform.isWindows ? "avutil-56.dll" : "libavutil.so"),DynamicLibrary.open(Platform.isWindows ? "swresample-3.dll" : "libswresample.so"),DynamicLibrary.open(Platform.isWindows ? "avcodec-58.dll" : "libavcodec.so"),DynamicLibrary.open(Platform.isWindows ? "postproc-55.dll" : "libpostproc.so"),DynamicLibrary.open(Platform.isWindows ? "swscale-5.dll" : "libswscale.so"),DynamicLibrary.open(Platform.isWindows ? "avformat-58.dll" : "libavformat.so"),DynamicLibrary.open(Platform.isWindows ? "avfilter-7.dll" : "libavfilter.so"),DynamicLibrary.open(Platform.isWindows ? "avdevice-58.dll" : "libavdevice.so"),
];Pointer<T> _looup<T extends NativeType>(String symbolName) {for (final i in _libs4) {if (i.providesSymbol(symbolName)) {return i.lookup(symbolName);}}throw Exception("can not find the symbol $symbolName from library");
}final ff = FFmpegAutoGen.fromLookup(_looup);

调用方法是

final frame=ff.av_frame_alloc();

或者将自动生成的FFmpegAutoGen对象去掉,直接将ffmpeg的方法都变成全局方法,方便调用,此处略。


二、制作成插件

将上述生成好的代码放入插件中,方便使用。

flutter create ffmpeg_interface -t plugin --platforms windows,linux,android

制作好的插件
https://download.csdn.net/download/u013113678/89410377

注:插件名称为ffmpeg_interface,包含ffmpeg的所有dart接口,ffmpeg接口版本为4.x,插件中只有ffmpeg接口,ffmpeg动态库(4.x)需要自行提供(因为考虑到不同项目需求不同,有些需要全功能的ffmpeg库,有些需要最小体积的ffmpeg库等,所以插件中不提供库)。目前只支持windows、linux、android。不支持macos和ios(由于没有设备,且网上暂时未搜索到VideoToolBox.h相关头文件下载,因此无法生成苹果相关的ffmpeg dart代码)。


三、使用示例

ffmpeg_interface插件的使用示例

1、添加插件

因为是本地插件,指定插件路径即可。比如放在项目的plugins/ffmpeg_interface,则path: plugins/ffmpeg_interface
在这里插入图片描述

2、调用ffmpeg

需要确保运行目录中有ffmpeg(4.x)的动态库。

引用

import 'package:ffmpeg_interface/ffmpeg/ffmpeg.dart';

显示ffmpeg版本


Text('Running on: $_platformVersion\n ffmpeg version is ${av_version_info().cast<Utf8>().toDartString()}')

运行效果
在这里插入图片描述


总结

以上就是今天要讲述的内容,生成ffmpeg的dart代码在有了ffigen的情况下,容易了很多,但是也有一些细节需要注意的,尤其是想要生成所的接口,就需要确保所有头文件都包含,以及过滤掉不相关的符号以及将一些公有符号的下划线前缀去掉避免在dart中无法使用。

相关文章:

Flutter 使用ffigen生成ffmpeg的dart接口

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频 第六章 桌面端使用texture_rgba_renderer渲染视频 第七章 使用ff…...

(message): No CUDA toolset found.

解决方法&#xff1a; C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\visual_studio_integration\MSBuildExtensions\ 下的4个文件 复制到 D:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\BuildCustomizations\下。…...

【python】邮箱正则验证

当然可以。以下是一个使用Python正则表达式的例子&#xff0c;用于检查一个字符串是否是一个有效的电子邮件地址&#xff1a; import re def is_valid_email(email):regex r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$return bool(re.match(regex, email)) # 测试电子邮件…...

深度学习(四)——torchvision中数据集的使用

1. 参数详解 torchvision中每个数据集的参数都是大同小异的&#xff0c;这里只介绍CIFAR10数据集 该数据集的数据格式为PIL格式 class torchvision.datasets.CIFAR10(root:str,train:boolTrue,transform:Optional[Callable]None,target_transform:Optional[Callable]None,do…...

【全开源】图书借阅管理系统源码(ThinkPHP+FastAdmin)

&#x1f4da;图书借阅管理系统&#xff1a;打造你的私人图书馆 一款基于ThinkPHPFastAdmin开发的简易图书借阅管理系统&#xff0c;一款轻量级的图书借阅管理系统&#xff0c;具有会员管理&#xff0c;图书管理&#xff0c;借阅及归还管理&#xff0c;会员充值等基本功能&…...

Mysql中使用where 1=1有什么问题吗

昨天偶然看见一篇文章&#xff0c;提到说如果在mysql查询语句中&#xff0c;使用where 11会有性能问题&#xff1f;&#xff1f; 这着实把我吸引了&#xff0c;因为我项目中就有不少同事&#xff0c;包括我自己也有这样写的。为了不给其他人挖坑&#xff0c;赶紧学习一下&…...

中心极限定理的MATLAB例

独立同分布的中心极限定理&#xff1a; 设 X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1​,X2​,…,Xn​ 是独立同分布的随机变量序列&#xff0c;且 E ( X i ) μ E(X_i) \mu E(Xi​)μ&#xff0c; D ( X i ) σ 2 > 0 D(X_i) \sigma^2 > 0 D(Xi​)σ2>0&a…...

定义input_password函数,提示用户输入密码.如果用户输入长度<8,抛出异常,如果用户输入长度>=8,返回输入的密码

def input_password(password):str1passwordlen1len(str1)try:if len1<8:raise ValueError("密码长度不能小于8")else:return print(f"你的密码为:{password},请确认")except ValueError as e:print(f":Error is {e}")number1input("请…...

【深度学习】IP-Adapter 和 InstantID 的核心机制比较

IP-Adapter 和 InstantID 是两个在图像生成中具有不同优势和应用场景的模型。以下是这两个模型的区别及其理论分析。 IP-Adapter 特点: 图像提示能力: IP-Adapter 通过引入图像提示能力&#xff0c;使得预训练的文本到图像扩散模型可以接受图像作为提示&#xff0c;从而生成…...

JEPaaS 低代码平台 j_spring_security_check SQL注入漏洞复现

0x01 产品简介 JEPaaS是一款优秀的软件平台产品,可视化开发环境,低代码拖拽式配置开发,操作极其简单,可以帮助解决Java项目80%的重复工作,让开发更多关注业务逻辑,大大提高开发效率,能帮助公司大幅节省人力成本和时间成本,同时又不失灵活性。适用于搭建 OA、ERP、CRM、…...

天锐绿盾 | 无感知加密软件、透明加密系统、数据防泄漏软件

摘要&#xff1a;文件加密软件,包含禁止非授权的文件泄密和抄袭复制解决方案即使被复制泄密都是自动加密无法阅读,透明加密,反复制软件,内网监控,文件加密,网络安全方案,透明文件加密,加密文件,图纸加密,知识产权保护,加密数据; 通过绿盾信息安全管理软件&#xff0c;系统在不改…...

kubernetes(k8s)集群部署(2)

目录 k8s集群类型 k8s集群规划&#xff1a; 1.基础环境准备&#xff1a; &#xff08;1&#xff09;保证可以连接外网 &#xff08;2&#xff09;关闭禁用防火墙和selinux &#xff08;3&#xff09;同步阿里云服务器时间&#xff08;达到集群之间时间同步&#xff09; &…...

Git操作指南

1、提交代码操作 拉取线上分支&#xff0c;防止本地代码提交冲突 git pull origin dev git add . git commit -m “给本次提交添加注释” git push origin dev 2、打分支并切换分支 git checkout -b 新建并切换到新分支 切换到主分支 git checkout main git merge dev git p…...

全域推广和标准推广哪个更好。谁更容易获客?

随着全域概念的兴起&#xff0c;全域推广逐渐走进人们视野&#xff0c;并成为新的互联网热词。在此背景下&#xff0c;与全域推广相关的话题&#xff0c;如全域推广是什么及全域推广和标准推广的区别等成为了许多创业者讨论和搜索的对象。 所谓的全域推广&#xff0c;简单来说…...

首张地下地图!D-Wave 专用量子计算机助力沙特阿美完成地震成像

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;800字丨3分钟阅读 摘要&#xff1a;过去两年中&#xff0c;沙特阿美研究中心一直在使用总部在加拿大的D-Wave 公司的专用量子计算技术&#xff0c;…...

机器学习分类及算法

1. 深度学习 1.1学习算法 1.2基本术语和概念 1.3机器学习分类常用算法 1.3.1线性回归 1.3.2逻辑回归 1.3.3决策树 1.3.4朴素贝叶斯 1.3.5支持向量机SVM 1.3.6K-最近临邻KNN 还有K-均值&#xff08;k-means&#xff09;、随机森林、降维、人工神经网络等 1.4超参数和验证集 1.4.…...

电容器连接到 PCB 电源层的过孔配置

为什么我们需要去耦电容器&#xff1f; 时钟数字IC通常需要大的瞬态电源电流。例如&#xff0c;大型微处理器可以在很短的时间内消耗高达 10 A 的电流。随着 IC 输出的上升/下降时间缩短&#xff0c;我们需要以更高的速率提供瞬态能量。PCB 的电源和接地导体确实存在一定的电感…...

springboot+shiro+jwt 兼容session和token

最近和别的软件集成项目&#xff0c;需要提供给别人接口来进行数据传输&#xff0c;发现给他token后并不能访问我的接口&#xff0c;拿postman试了下还真是不行。检查代码发现项目的shiro配置是通过session会话来校验信息的 &#xff0c;我之前一直是前后端自己写&#xff0c;用…...

CSS Display(显示)

CSS Display(显示) 概述 CSS&#xff08;层叠样式表&#xff09;中的display属性是控制元素如何显示的关键属性。它决定了元素的盒模型类型&#xff0c;即元素是块级元素、内联元素还是其他类型的元素。display属性对于网页布局和元素样式的控制至关重要。 基本用法 块级元…...

【PB案例学习笔记】-20制作一个超链接按钮

写在前面 这是PB案例学习笔记系列文章的第19篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...