macOS Melt WebVfx 踩坑记
注:本文所示代码基于 webvfx:8fb6da7、mlt:66545cb
Melt (Mlt) 是一个非线性视频编辑的框架。WebVfx 是 Melt 框架的一个插件。 这俩货的文档都简单得很,StackOverflow上的问答也少得可怜😵。出于工作需要硬着头皮算是基本玩通了,这里记录下。
首先安装 melt 框架,用 Homebrew 一键完成。
brew install mlt
然后根据文档给出的示例跑如下命令(要补上必要的参数)
melt red.mlt -transition webvfx:transition.html -consumer avformat:output.mp4
得到 output.mp4。一切都很顺利,没有任何报错。然后打开 output.mp4 一看,摔,没有任何效果。😕
哦,跑下
melt -query filters | grep webvfx
没有任何结果,原来是没有装 WebVfx,可是你他妈为啥不给我报错啊😡
好吧,安装 WebVfx。这货需要 Qt,那么
brew install qt
一下就搞定了咯。然后开始编译
qmake -r PREFIX=/usr/local PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
make
结果报错:Webkitwidget not found
。查了一番,原来 brew 安装的 Qt 不包含 QtWebkit,需要指定安装,所以
brew remove qt
brew install qt --with-qtwebkit
这样就没法直接用二进制包,需要编译 Qt,这一步花了我 4个半小时... ☹️
需要运行 brew link qt
或者把 /usr/local/opt/qt/bin
加到 PATH 里。
还按照 brew 的提示设置了环境变量
- LDFLAGS: -L/usr/local/opt/qt/lib
- CPPFLAGS: -I/usr/local/opt/qt/include
- PKG_CONFIG_PATH: /usr/local/opt/qt/lib/pkgconfig
再次编译 WebVfx,还是报错
factory.cpp:9:14: fatal error: 'mlt/framework/mlt_factory.h' file not found #include <mlt/framework/mlt_factory.h>
尼玛,明明安装了啊为啥找不到😤。试着设置几个环境变量,还是找不到。崩溃,哭着去看 Makefile,发现有个 webvfx/mlt/mlt.pro
有个 MLT_PREFIX
变量来指定 mlt 库的路径
>macx:isEqual(QT_MAJOR_VERSION, 5) {
# QMake from Qt 5.1.0 on OSX is messing with the environment in which it runs
# pkg-config such that the PKG_CONFIG_PATH env var is not set.
isEmpty(MLT_PREFIX) {
MLT_PREFIX = /opt/local
}
INCLUDEPATH += $$MLT_PREFIX/include
INCLUDEPATH += $$MLT_PREFIX/include/mlt
LIBS += -L$$MLT_PREFIX/lib -lmlt
} else {
卧槽,文档里根本没写这个东西啊🙄😨🤢。加上这个变量,因为 melt 装在 /usr/local/opt/mlt
,所以跑
qmake -r PREFIX=/usr/local PKG_CONFIG_PATH=/usr/local/lib/pkgconfig MLT_PREFIX=/usr/local/opt/mlt
make
make install
终于装好了,运行
ls /usr/local/Cellar/mlt/6.4.1/lib/mlt/ | grep webvfx
> libmltwebvfx.dylib
melt -query filters | grep webvfx
> - webvfx
已经安装好了。
进入 WebVfx 的 demo/mlt 目录,运行 demo,没有报错,但跑到调用 WebVfx 那一帧就卡住了(黑人问号???😑🤔
好吧,又是各种找,终于发现 Building 那一节里有这么一段话:
The MLT melt command will not work with WebVfx on MacOS because the Qt event loop must run on the main thread. If you set MLT_SOURCE to the root of your MLT source code directory, then a qmelt executable will be installed which behaves the same as melt but works with WebVfx on MacOS.
所以我还得再编译一个 qmelt,根据文档加上 melt 源码路径,跑命令
qmake -r PREFIX=/usr/local PKG_CONFIG_PATH=/usr/local/lib/pkgconfig MLT_PREFIX=/usr/local/opt/mlt MLT_SOURCE=~/Project/mlt
make
又一个报错😩:
/Users/xxx/Project/mlt/src/melt/melt.c:814:23: error: use of undeclared identifier 'MLT_LOG_TIMINGS' mlt_log_set_level( MLT_LOG_TIMINGS );
报错的文件是 src/melt/melt.c
,看 Melt 源码,其中说找不到的变量 MLT_LOG_TIMINGS
是在 src/framework/mlt_log.h
里定义的。
可是 melt.c 中明明引用了
#include <framework/mlt.h>
而 mlt.h 引用了 mlt_log.h,所以考虑是 <framework/mlt.h>
没有被成功 include,因此修改了 qmelt 的 Makefile 中 INCPATH 变量,加上了 -I/Users/xxx/Project/mlt/src
。
再次编译,成功。😙
改 WebVfx 的 demo 脚本:
- 把 melt 改成 qmelt (或者设置 VFX_MELT 变量指向 qmelt)
- 把 -consumer 改成 avformat (somehow,sdl在我的mac上跑不起来)
- 把 webvfx:xxx.html 改成 webvfx resouce=xxx.html 形式,否则 qmelt 不认
跑 demo 脚本,查看产出视频,效果符合预期。
喜极而泣!🤣