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

相关推荐
惜.己23 分钟前
Jmeter中的断言(二)
测试工具·jmeter·1024程序员节
AiFlutter2 小时前
Flutter通过 Coap发送组播
flutter
韩曙亮3 小时前
【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
ffmpeg·音视频·avpacket·av_packet_clone·av_packet_ref·ffmpeg内存结构
oushaojun27 小时前
ubuntu中使用ffmpeg和nginx推流rtmp视频
nginx·ubuntu·ffmpeg·rtmp
莫固执,朋友7 小时前
网络抓包工具tcpdump 在海思平台上的编译使用
网络·ffmpeg·音视频·tcpdump
lxkj_20248 小时前
修改ffmpeg实现https-flv内容加密
网络协议·https·ffmpeg
cuijiecheng20188 小时前
音视频入门基础:MPEG2-TS专题(6)——FFmpeg源码中,获取MPEG2-TS传输流每个transport packet长度的实现
ffmpeg·音视频
西电研梦10 小时前
考研倒计时30天丨和西电一起向前!再向前!
人工智能·考研·1024程序员节·西电·西安电子科技大学
惜.己10 小时前
Jmeter中的断言(四)
测试工具·jmeter·1024程序员节
VisionX Lab13 小时前
数据脱敏工具:基于 FFmpeg 的视频批量裁剪
python·ffmpeg·音视频