注:本文所示代码基于 webvfx:8fb6da7mlt: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 脚本:

  1. 把 melt 改成 qmelt (或者设置 VFX_MELT 变量指向 qmelt)
  2. 把 -consumer 改成 avformat (somehow,sdl在我的mac上跑不起来)
  3. 把 webvfx:xxx.html 改成 webvfx resouce=xxx.html 形式,否则 qmelt 不认

跑 demo 脚本,查看产出视频,效果符合预期。

喜极而泣!🤣