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动态库打包到程序目录。

相关推荐
孤鸿玉6 小时前
Fluter InteractiveViewer 与ScrollView滑动冲突问题解决
flutter
叽哥13 小时前
Flutter Riverpod上手指南
android·flutter·ios
BG1 天前
Flutter 简仿Excel表格组件介绍
flutter
zhangmeng1 天前
FlutterBoost在iOS26真机运行崩溃问题
flutter·app·swift
恋猫de小郭1 天前
对于普通程序员来说 AI 是什么?AI 究竟用的是什么?
前端·flutter·ai编程
卡尔特斯1 天前
Flutter A GlobalKey was used multipletimes inside one widget'schild list.The ...
flutter
w_y_fan1 天前
Flutter 滚动组件总结
前端·flutter
醉过才知酒浓2 天前
Flutter Getx 的页面传参
flutter
火柴就是我2 天前
flutter 之真手势冲突处理
android·flutter
Speed1232 天前
`mockito` 的核心“打桩”规则
flutter·dart