Flutter 将ffmpeg动态库制做成插件

Flutter视频渲染系列

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


文章目录


前言

有了上一章的ffmpeg接口,我们可以很方便的通过dart调用ffmpeg,但是需要自己部署ffmpeg动态库还是比较麻烦的,尤其是多个平台多个项目时,去一个一个编写部署代码显然是不合理的。最好方式应该是将ffmpeg动态库的部署写在一个插件中,需要使用的项目直接引用插件即可。


一、如何实现

1、生成插件

bash 复制代码
flutter create ffmpeg_package -t plugin --platforms windows,linux,android

2、Windows部署

windows上直接部署预编译的ffmpeg动态库。其实也可以源码生成,这样就可以适应x86、x64、arm64不同架构的输出目标

(1)、添加预编译dll

(2)cmake中添加动态库

在cmake中添加头文件目录、链接、部署

bash 复制代码
#搜索所有dll
file(GLOB DLL_FILES  "${CMAKE_CURRENT_SOURCE_DIR}/sdk/bin/*.dll" ) 
#搜索所有lib
file(GLOB LIB_FILES  "${CMAKE_CURRENT_SOURCE_DIR}/sdk/lib/*.lib" ) 
# Source include directories and library dependencies. Add any plugin-specific
# dependencies here.
target_include_directories(${PLUGIN_NAME} INTERFACE
  "${CMAKE_CURRENT_SOURCE_DIR}/include"
  #添加头文件目录
  "${CMAKE_CURRENT_SOURCE_DIR}/sdk/include"
  )
target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin
#链接符号
PUBLIC
"${LIB_FILES}"
)
# List of absolute paths to libraries that should be bundled with the plugin.
# This list could contain prebuilt libraries, or libraries created by an
# external build triggered from this build file.
set(ffmpeg_package_bundled_libraries
  ""
  #部署dll
  "${DLL_FILES}"
  PARENT_SCOPE
)

2、Linux部署

由于Linux系统的架构有多种x86、x64、arm、arm64等等,且不同系统的glibc等依赖环境也不同,所以直接采用源码生成。

(1)、添加源码

将ffmpeg源码放置到linux目录下,如下图。

(2)、编写ffmpeg生成脚本

创建build.sh,编写脚本,对ffmpeg源码进行,configure并make、make install。脚本中判断是否已生成,避免每次flutter重复生成浪费时间。

bash 复制代码
set -e
script_path=$(
    cd "$(dirname "$0")"
    pwd
)
if [ -e "$script_path/output/lib/libavcodec.so" ]; then
    exit 0
fi
build_ffmpeg() {
    echo ffmpeg Configuring...
    ./configure \
        --prefix=$PREFIX \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --enable-gpl \
        --enable-pthreads \
        --extra-cflags="-Os -fpic -DVK_ENABLE_BETA_EXTENSIONS=0  $FFMPEG_EXTRA_CFLAGS" \
        --extra-ldflags="$FFMPEG_EXTRA_LDFLAGS" \
        --pkg-config="pkg-config --static" \
        $SHARED_OR_STATIC_FLAG \
        $FFMPEG_EXTRA_CONFIGURE_FLAGS
    echo ffmpeg Building...
    if [ -e "Makefile" ]; then
        make clean
    fi
    make -j$(nproc)
    echo ffmpeg Installing...
    make install
}
PREFIX=$script_path/output
cd $script_path/ffmpeg
SHARED_OR_STATIC_FLAG="--enable-shared  --disable-static"
build_ffmpeg

(3)、cmake中调用脚本

在flutter的cmake中调用ffmpeg的生成脚本。

bash 复制代码
execute_process(COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/sdk/build.sh")

(4)cmake中添加动态库

bash 复制代码
file(GLOB DLL_FILES  "${CMAKE_CURRENT_SOURCE_DIR}/sdk/output/lib/*.so*" ) 
set(ffmpeg_package_bundled_libraries
  ""
  "${DLL_FILES}"
  PARENT_SCOPE
)

3、Android部署

参考《安卓部署ffmpeg全平台so并实现命令行调用》


二、制作好的插件

包含windows、linux、android的ffmpeg动态库插件,ffmpeg版本为4.3。
https://download.csdn.net/download/u013113678/89410377


三、使用示例

ffmpeg_package插件的使用示例

1、添加插件

因为是本地插件,指定插件路径即可。比如放在项目的plugins/ffmpeg_package,则path: plugins/ffmpeg_package

2、ffi调用ffmpeg

使用第七章的插件直接调用。

引用

dart 复制代码
import 'package:ffmpeg_interface/ffmpeg/ffmpeg.dart';

显示ffmpeg版本

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

运行效果

windows上,dll已自动部署到程序目录。

3、c++调用

项目中自定义或本身的c++代码中,直接引用头文件即可调用。

c 复制代码
extern "C"{
#include "libavformat/avformat.h"
}
void test(){
 auto ctx= avformat_alloc_context();
}

总结

以上就是今天要讲述的内容,生成ffmpeg动态库的插件还是比较简单的,尤其是有预编译库的情况,但是如果是源码编译则会比较麻烦一些,尤其是需要添加第三方依赖时,编写编译脚本会将对复杂且繁琐,总的来说本章生成的插件还是很方便的,只需要有引用插件,就可以将ffmpeg动态库打包到程序目录。

相关推荐
云和数据.ChenGuang9 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
天空依然蔚蓝10 小时前
分享一个自动检测网站在线状态的python程序
python·运维开发·1024程序员节
路灯上の马陈10 小时前
二叉树的定义与性质
数据结构·二叉树·树结构·1024程序员节
好的佩奇11 小时前
Dart 之类修饰符
android·flutter·dart
中伟视界15 小时前
煤矿安全监控数据造假识别:时序异常检测与AI视频交叉核验工程实践
1024程序员节
Be for thing15 小时前
PyTorch基础|Tensor张量详解,张量创建、数据类型与常用操作
pytorch·学习·1024程序员节
路灯上の马陈15 小时前
数据结构-树
数据结构·1024程序员节
weixin_4173968316 小时前
星级酒店境外电视频道怎么合法接入?合规要点与核对清单
开发语言·前端·php·1024程序员节·综合布线
北方的银狐-Zero17 小时前
OntoL 7.0|面向工业多智能体的语义本体套件,让异构系统真正 “看懂彼此”——OntoL的本体产品矩阵
人工智能·mysql·sqlite·1024程序员节·本体论·本体产品
云和数据.ChenGuang18 小时前
深入剖析 Python 的 MRO 规则:从 C3 线性化到实战踩坑
开发语言·python·1024程序员节