conda环境下ffmpeg使用x264编码
主要是解决Unknown encoder 'libx264'
的问题。亦涉及ffmpeg
常用命令和参数的解释。
通过ffmpeg转换为视频格式x264(-vcodec libx264)执行时报错。
1 | ffmpeg version 4.0 Copyright (c) 2000-2018 the FFmpeg developers |
注意其中--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 | git clone https://code.videolan.org/videolan/x264.git |
下载LAME源码并编译安装。
1 | cd lame-3.100/ |
克隆ffmepg源码并编译安装。
1 | git clone git://source.ffmpeg.org/ffmpeg.git |
以上是针对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
开始递增。
将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