ffmpeg本身是一款开源的编解码软件,在4.3版本后加入xfade的转场,在github上发现GRE大神使用WebGL编写的一些转场,效果十分酷炫,以及Travis Fischer大神写的将ffmpeg和gl-transitions链接到一起的文件,但网上教程基本都是基于Ubuntu系统,转到centos上还是有很多的坑存在,最后查找了很多资料,踩了很多坑整理出这篇文档,有问题的可以在评论区讨论。
本文已在docker上实践成功,基于Linux without EGL路线。
首先更新的package至软件源中的最新版,改成国内源下载快一点。
yum -y update
安装必要的package
yum -y install autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel libxml2-devel mesa* freeglut*
可以创建一个ffmpeg_sources目录,下面所有的文件都安装在这个包下面
# 我这里是放在了/usr/local下面
mkdir /usr/local/ffmpeg_sources
centos7的安装cmake版本基本是2.8左右的,后续依赖的glfw需要升级cmake。
# 移除旧的cmake版本
yum remove cmake -y
wget https://cmake.org/files/v3.14/cmake-3.14.5.tar.gz
tar zxvf cmake-3.14.5.tar.gz
cd cmake-3.14.5
./configure
make && make install
然后安装OpenGL相关库(glew)
yum -y install glew glew-devel
安装glfw3
cd /usr/local/ffmpeg_sources
wget https://github.com/glfw/glfw/archive/refs/tags/3.3.4.tar.gz
tar -xzvf glfw-3.3.4.tar.gz
cd glfw-3.3.4
yum -y install libXrandr*
yum -y install libXcursor*
yum -y install libXi*
cmake .
make && make install
安装Xvfb
yum -y install Xvfb
一般下载的ffmpeg都是官网编译好的,这次要下载源码自行编译
全版本地址:https://ffmpeg.org/releases/
选择合适的版本,本文选择的是linux下4.4版本(https://ffmpeg.org/releases/ffmpeg-4.4.tar.gz)。
在下载之前,我们先下好ffmepg的依赖。首先安装所需的汇编依赖。
安装nasm
cd /usr/local/ffmpeg_sources
curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2
tar xjvf nasm-2.15.05.tar.bz2
cd nasm-2.15.05
./autogen.sh
./configure
make
make install
安装yasm
cd /usr/local/ffmpeg_sources
curl -O -L https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
make install
安装libx264
cd /usr/local/ffmpeg_sources
#下载不下来可以把https改为git
git clone --branch stable --depth 1 https://code.videolan.org/videolan/x264.git
cd x264
./configure --enable-static
make
make install
下载ffmpeg
cd /usr/local/ffmpeg_sources
wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.gz
tar -xzvf ffmpeg-4.4.tar.gz
下载ffmpeg-gl-transition
cd /usr/local/ffmpeg_sources
git clone https://github.com/transitive-bullshit/ffmpeg-gl-transition.git
# 注意clone后进入ffmpeg4.4目录下
cd ffmpeg-4.4
# 拷贝vf_gltransition.c到libavfilter
cp /usr/local/ffmpeg_sources/ffmpeg-gl-transition/vf_gltransition.c libavfilter/
拷贝之后,ffmpeg-gl-transition还有个diff文件,其实就是在ffmpeg/libavfilter里加入要编译vf_gltransition.c这个文件。
所以我们进入libavfilter文件夹
# 在libavfilter/Makefile里加入
OBJS-$(CONFIG_GLTRANSITION_FILTER) += vf_gltransition.o
# 在libavfilter/allfilters.c加入
extern AVFilter ff_vf_gltransition;
而后我们还需要修改我们刚刚复制进来的vf_gltransition.c,去掉宏定义,这里直接引用原作者的话
Linux without EGL
If you don’t want to use EGL, just comment out this line in
vf_gltransition.c
#ifndef __APPLE__ # define GL_TRANSITION_USING_EGL // remove this line if you don't want to use EGL #endif
在修改完成后,开始编译ffmpeg
cd /usr/local/ffmpeg_sources/ffmpeg-4.4
# 指定pkgconfig 避免找不到
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
# 执行configure
./configure --enable-nonfree --enable-cross-compile --enable-gpl --enable-libx264 --enable-opengl --enable-filter=gltransition --extra-libs='-lGLEW -lglfw3 -ldl -lX11'
# 执行make
make
# 建立软连接
ln ffmpeg /usr/bin/ffmpeg && ln ffprobe /usr/bin/ffprobe
完成后,需要启动Xvfb,直接守护进程启动
nohup Xvfb :1 -screen 0 1280x1024x16 >/dev/null 2>&1 &
# 设置环境变量
export DISPLAY=:1
最后可以执行命令测试下了
# 转场文件在https://github.com/gl-transitions/gl-transitions
ffmpeg -i media/0.mp4 -i media/1.mp4 -filter_complex "gltransition=duration=4:offset=1.5:source=crosswarp.glsl" -y out.mp4
本文仅提供参考,如有问题可留言,或在本文出现的所有链接中寻找答案,还有百度或谷歌。
推荐Asa_Ho博主写了很多魔改,地址ffmpeg 再编译使用 ffmpeg-gl-transition
https://trac.ffmpeg.org/wiki/CompilationGuide/Centos
https://github.com/transitive-bullshit/ffmpeg-gl-transition