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

相关推荐
yaosheng_VALVE1 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king1 小时前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
cuijiecheng20187 小时前
音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现
ffmpeg·音视频
cuijiecheng20188 小时前
音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现
ffmpeg·音视频·aac
流氓也是种气质 _Cookie20 小时前
uniapp blob格式转换为video .mp4文件使用ffmpeg工具
ffmpeg·uni-app
网络安全queen1 天前
网络安全-企业环境渗透2-wordpress任意文件读&&FFmpeg任意文件读
安全·web安全·ffmpeg
sunly_1 天前
Flutter:导航,tab切换,顶部固定,列表分页滚动
开发语言·javascript·flutter
yerennuo1 天前
FFmpeg库之ffmpeg
qt·ffmpeg
韩曙亮1 天前
【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )
ffmpeg·音视频·视频流·mediainfo·解封装·码流
yerennuo1 天前
FFmpeg 框架简介和文件解复用
ffmpeg