在Android中使用FFmpeg实现视频稳定时找不到vidstabdetect滤镜怎么办
问题根因
vidstabdetect、vidstabtransform不属于FFmpeg内置滤镜,依赖第三方GPL协议库libvidstab,你目前使用的FFmpeg-Android-Java、普通版MobileFFmpeg、默认版FFmpegKit均未开启libvidstab的编译链接,因此会报错找不到对应滤镜。
解决方法
方案一:使用预编译的带libvidstab支持的FFmpeg包
直接选用FFmpegKit的full-gpl版本即可,该版本默认编译了libvidstab依赖,原生支持vidstab系列滤镜。
注意:libvidstab属于GPL协议组件,使用full-gpl版本的FFmpegKit后,你的项目若对外分发需要遵循GPL协议要求开源相关代码。
方案二:自行编译FFmpeg安卓包
如果需要自定义编译配置,按以下步骤操作:
- 先交叉编译对应ABI架构的libvidstab静态库
- 编译FFmpeg时添加编译参数
--enable-gpl --enable-libvidstab,链接提前编译好的libvidstab静态库即可
使用步骤
集成成功后先执行ffmpeg -filters命令,若输出中存在vidstabdetect、vidstabtransform条目则说明组件集成正常,之后按两步执行稳像操作:
- 分析视频抖动参数,生成变换配置文件
ffmpeg -i 输入视频路径 -vf vidstabdetect=shakiness=5:accuracy=15 -f null -
执行后会在当前目录生成transforms.trf参数文件,其中shakiness参数取值范围1-10,原视频抖动越大取值越高,可根据实际效果调整。
- 应用变换参数生成稳像视频
ffmpeg -i 输入视频路径 -vf vidstabtransform=smoothing=30:input="transforms.trf" 输出视频路径
其中smoothing参数为平滑窗口大小,取值越大稳像效果越平稳,但画面裁切幅度也会越高,可根据需求调整。
其他说明
deshake是FFmpeg内置的轻量稳像滤镜,效果弱于vidstab是正常情况。vidstab的处理耗时远高于deshake,建议在安卓端处理时放在子线程执行,避免阻塞UI。
内容的提问来源于stack exchange,提问作者Not_Bluffing
相关产品推荐
相关产品推荐

