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部署
二、制作好的插件
包含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动态库打包到程序目录。