怎么看網(wǎng)站做的外鏈百度app客服人工在線咨詢
Flutter視頻渲染系列
第一章 Android使用Texture渲染視頻
第二章 Windows使用Texture渲染視頻
第三章 Linux使用Texture渲染視頻
第四章 全平臺(tái)FFI+CustomPainter渲染視頻
第五章 Windows使用Native窗口渲染視頻
第六章 桌面端使用texture_rgba_renderer渲染視頻
第七章 使用ffigen生成ffmpeg的dart接口(本章)
文章目錄
- Flutter視頻渲染系列
- 前言
- 一、如何實(shí)現(xiàn)
- 1、添加ffigen插件
- 2、創(chuàng)建ffigen.yaml
- 3、ffigen命令生成dart代碼
- 4、關(guān)聯(lián)ffmpeg庫
- 二、制作成插件
- 三、使用示例
- 1、添加插件
- 2、調(diào)用ffmpeg
- 總結(jié)
前言
前面幾章介紹了flutter各種視頻渲染的方法,視頻渲染前顯然是需要先獲取視頻流并解碼,這些操作就需要用到ffmpeg,前面的幾章的解碼都是通過c語言調(diào)用ffmpeg,再將數(shù)據(jù)傳輸?shù)絛art渲染的。本章將提供一種生成ffmpeg dart接口的方法,直接用dart就可以調(diào)用ffmpeg進(jìn)行拉流并解碼然后顯示。
一、如何實(shí)現(xiàn)
1、添加ffigen插件
插件的地址是https://pub-web.flutter-io.cn/packages/ffigen。我們直接在pubspec.yaml添加依賴即可。
依賴。ffigen不是運(yùn)行庫,是一個(gè)開發(fā)工具,通過執(zhí)行命令來生成dart代碼,所以放在dev_dependencies即可。
ffigen: ^12.0.0
2、創(chuàng)建ffigen.yaml
創(chuàng)建一個(gè)yaml文件用于指定需要生成的頭文件以及生成的對(duì)象名稱等信息。ffigen.yaml的用法查看插件官網(wǎng):https://pub-web.flutter-io.cn/packages/ffigen
編寫生成信息,需要指定頭文件、過濾規(guī)則、以及名稱轉(zhuǎn)換規(guī)則
#usage:cmdline "dart run ffigen --config ffmpeg_ffigen.yaml" see more:https://pub-web.flutter-io.cn/packages/ffigen
name: FFmpegAutoGen#生成的dart類名
output:bindings: "lib/ffmpeg/ffmpeg_auto_gen.dart"#生成的dart文件路徑
headers:entry-points:#需要生成dart代碼的ffmpeg頭文件- "ffi/sdk/include/libavcodec/avcodec.h"#其他ffmpeg頭文件略include-directives:- "**.**"
compiler-opts:- "-I ffi/sdk/include"
#名稱過濾規(guī)則略
#名稱轉(zhuǎn)換規(guī)則略
3、ffigen命令生成dart代碼
ffmpeg_ffigen.yaml所在目錄,命令行在執(zhí)行。需要安裝lvvm,不同平臺(tái)具體查看https://pub-web.flutter-io.cn/packages/ffigen
dart run ffigen --config ffmpeg_ffigen.yaml
生成的dart文件
生成的dart代碼
4、關(guān)聯(lián)ffmpeg庫
新建一個(gè)ff.dart文件,將上述步驟生成代碼與ffmpeg庫關(guān)聯(lián)起來,下列是ffmpeg4.x的示例。
import 'dart:ffi';
import 'dart:io';
import 'package:ffmpeg_interface/ffmpeg/ffmpeg_auto_gen.dart';
import 'package:ffi/ffi.dart';List<DynamicLibrary> _libs4 = [DynamicLibrary.open(Platform.isWindows ? "avutil-56.dll" : "libavutil.so"),DynamicLibrary.open(Platform.isWindows ? "swresample-3.dll" : "libswresample.so"),DynamicLibrary.open(Platform.isWindows ? "avcodec-58.dll" : "libavcodec.so"),DynamicLibrary.open(Platform.isWindows ? "postproc-55.dll" : "libpostproc.so"),DynamicLibrary.open(Platform.isWindows ? "swscale-5.dll" : "libswscale.so"),DynamicLibrary.open(Platform.isWindows ? "avformat-58.dll" : "libavformat.so"),DynamicLibrary.open(Platform.isWindows ? "avfilter-7.dll" : "libavfilter.so"),DynamicLibrary.open(Platform.isWindows ? "avdevice-58.dll" : "libavdevice.so"),
];Pointer<T> _looup<T extends NativeType>(String symbolName) {for (final i in _libs4) {if (i.providesSymbol(symbolName)) {return i.lookup(symbolName);}}throw Exception("can not find the symbol $symbolName from library");
}final ff = FFmpegAutoGen.fromLookup(_looup);
調(diào)用方法是
final frame=ff.av_frame_alloc();
或者將自動(dòng)生成的FFmpegAutoGen對(duì)象去掉,直接將ffmpeg的方法都變成全局方法,方便調(diào)用,此處略。
二、制作成插件
將上述生成好的代碼放入插件中,方便使用。
flutter create ffmpeg_interface -t plugin --platforms windows,linux,android
制作好的插件
https://download.csdn.net/download/u013113678/89410377
注:插件名稱為ffmpeg_interface,包含ffmpeg的所有dart接口,ffmpeg接口版本為4.x,插件中只有ffmpeg接口,ffmpeg動(dòng)態(tài)庫(4.x)需要自行提供(因?yàn)榭紤]到不同項(xiàng)目需求不同,有些需要全功能的ffmpeg庫,有些需要最小體積的ffmpeg庫等,所以插件中不提供庫)。目前只支持windows、linux、android。不支持macos和ios(由于沒有設(shè)備,且網(wǎng)上暫時(shí)未搜索到VideoToolBox.h相關(guān)頭文件下載,因此無法生成蘋果相關(guān)的ffmpeg dart代碼)。
三、使用示例
ffmpeg_interface插件的使用示例
1、添加插件
因?yàn)槭潜镜夭寮?#xff0c;指定插件路徑即可。比如放在項(xiàng)目的plugins/ffmpeg_interface,則path: plugins/ffmpeg_interface
2、調(diào)用ffmpeg
需要確保運(yùn)行目錄中有ffmpeg(4.x)的動(dòng)態(tài)庫。
引用
import 'package:ffmpeg_interface/ffmpeg/ffmpeg.dart';
顯示ffmpeg版本
Text('Running on: $_platformVersion\n ffmpeg version is ${av_version_info().cast<Utf8>().toDartString()}')
運(yùn)行效果
總結(jié)
以上就是今天要講述的內(nèi)容,生成ffmpeg的dart代碼在有了ffigen的情況下,容易了很多,但是也有一些細(xì)節(jié)需要注意的,尤其是想要生成所的接口,就需要確保所有頭文件都包含,以及過濾掉不相關(guān)的符號(hào)以及將一些公有符號(hào)的下劃線前綴去掉避免在dart中無法使用。