主要是解决Unknown encoder 'libx264'
的问题。亦涉及ffmpeg
常用命令和参数的解释。
通过ffmpeg转换为视频格式x264(-vcodec libx264)执行时报错。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16ffmpeg version 4.0 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7.2.0 (crosstool-NG fa8859cb)
configuration: --prefix=/home/mjy/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
5git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --enable-static --enable-shared
make -j8
sudo make install
下载LAME源码并编译安装。1
2
3
4cd lame-3.100/
./configure
make -j8
sudo make install
克隆ffmepg源码并编译安装。1
2
3
4
5
6
7git 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