主要是解决Unknown encoder 'libx264'的问题。亦涉及ffmpeg常用命令和参数的解释。

通过ffmpeg转换为视频格式x264(-vcodec libx264)执行时报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ffmpeg version 4.0 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7.2.0 (crosstool-NG fa8859cb)
configuration: --prefix=/home/yourname/miniconda3 --cc=/opt/conda/conda-bld/ffmpeg_1531088893642/_build_env/bin/x86_64-conda_cos6-linux-gnu-cc --disable-doc --enable-shared --enable-static --enable-zlib --enable-pic --enable-gpl --enable-version3 --disable-nonfree --enable-hardcoded-tables --enable-avresample --enable-libfreetype --disable-openssl --disable-gnutls --enable-libvpx --enable-pthreads --enable-libopus --enable-postproc --disable-libx264
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
Input #0, image2, from 'res/mg_refine_0851/%05d.png':
Duration: 00:00:05.00, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgb24(pc), 1920x1080, 25 tbr, 25 tbn, 25 tbc
Unknown encoder 'libx264'

注意其中--disable-libx264,说明这个版本的二进制包中ffmpeg编译时并未启用libx264

尝试

重装conda下特定版本ffmpeg和x264包

试了conda install x264=='1!152.20180717' ffmpeg=4.0.2 -c conda-forge但conda-forge中删掉了特定版本,无法安装。
然后尝试conda install x264 ffmpeg -c conda-forge但安装后依然是--disable-libx264

从源码编译

ubuntu18.04可直接安装nasm。如果操作系统自带包管理提供的nasm版本低于2.13.02,则可在这里下载源码并编译。

1
sudo apt-get install nasm

克隆x264源码并编译安装。

1
2
3
4
5
git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --enable-static --enable-shared
make -j8
sudo make install

下载LAME源码并编译安装。

1
2
3
4
cd lame-3.100/
./configure
make -j8
sudo make install

克隆ffmepg源码并编译安装。

1
2
3
4
5
6
7
git clone git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg

./configure --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-shared --enable-openssl

make -j8
sudo make install

以上是针对linux系统环境下ffmpeg的编译使用,但conda环境下依然报错Unknown encoder 'libx264',解决方法见下一节。

解决方法

问题很简单,安装conda后系统环境被conda的base所取代,调用ffmpeg时优先是conda子环境下ffmpeg包的安装位置。可以用conda remove ffmpeg删掉,这样就会调用系统安装的ffmpeg
如果不想删掉conda的ffmpeg,只是临时使用编译的ffmpeg,可以直接指定ffmepg的位置。ubuntu通过包管理apt安装的位于/usr/bin/ffmpeg,而从源码编译的则安装在/usr/local/bin/ffmpeg
对于ubuntu18.04来说,无需编译,使用sudo apt install ffmpeg安装的3.4.6版即可使用x264编码。

debug

ffmpeg: error while loading shared libraries: libavdevice.so.57: cannot open shared object file: No such file or directory

从源码编译的ffmpeg其相关lib是安装在/usr/local/lib,如不确定可以通过find查找具体位置。

1
sudo find / -name libavdevice.so.57

然后将其添加到lib path,在/etc/ld.so.conf下添加一行/usr/local/lib。其实比较正统的做法是在/etc/ld.so.conf.d/文件夹下新建ffmpeg.conf,添加一行/usr/local/lib并将其include至/etc/ld.so.conf
使修改生效。

1
sudo ldconfig

其他

ffmpeg将视频转为png图片

1
ffmpeg -i example.mp4   output/%05d.png

在进行视频处理时有的任务需要先把视频转为图片逐帧处理,jpg有损,bmp无压缩体积过大。故采用无损压缩的png格式。其中图片的文件名格式为%5d,即从00001开始递增。

ffmpeg将png图片转为视频

1
ffmpeg -start_number 1 -i output/%05d.png -c:v libx264 -preset slow -x264-params qp=0 -psnr -y example.mp4

参数解释:
-start_number:开始处理的首个图片编号。
-c:v:指定编码。
-preset:预设设置,此处选slow会提升一点压缩率。
-x264-params:用来修改预设参数,此处qp=0为设置无损。不少地方建议用crf控制质量,因为同等大小下比qp优异,但对于无损来说,8bit和10bit的crf无损设定值不一样,故无损建议设为qp=0
-psnr:计算压缩帧的PSNR值。是开发调试用的参考,一般用不上。

参考资料

Unknown encoder ‘libx264’
Ffmpeg error in linux [closed]
ffmpeg Documentation
FFmpeg Wiki:Encode/H.264