Centos安装FFmpeg并用php调用

最近项目上有需求前端上传视频后端需要获取视频第一个画面作为封面
FFmpeg是一款强大的视频编解码工具,可以处理大量的编码格式。ffmpeg是开源项目,在Linux平台下开发,同时也可以在其它操作系统下编译运行,

包括Windows、Mac OS X等。本文将介绍在Linux下以源代码方式编译安装ffmpeg的方法。官网 https://ffmpeg.org/

下载

从官网下载源码我的下的版本是3.1.1

解压进如目录:

tar -jxvf ffmpeg-3.1.1.tar.bz2

cd ffmpeg-3.1.1

配置

安装yasm,ffmpeg编译中为了提高编译速度,使用了汇编指令,于是需要使用这个工具。

yum -y install yasm

配置必要选项,这一步根据自己需要开启或关闭某些选项,具体可以使用./configure –help查看,或者直接查看configure文件。本文使用如下简单配置。

./configure –enable-shared –prefix=/usr/local/ffmpeg

其中–enable-shared表示生成动态链接库,可以供以后编程使用,同时生成的可执行程序也依赖这些动态库。如果不加上–enable-shared选项则使用静态链接的方式编译,此时不会生成动态库,同时生成的ffmpeg等的可执行文件也比较大,但他们不需要动态库就可以直接运行

–prefix表示程序安装的目录,这里设为/usr/local/ffmpeg。

编译安装

编译,需要较长时间,十几分钟左右。

make

安装,很快完成。

make install

验证ffmpeg是否安装成功,/usr/local/ffmpeg/bin/ffmpeg –help  (注意这里是绝对路径)

因为$PATH中没有添加/usr/local/ffmpeg/bin 这个路径,永久添加方法:
#vim /etc/profile
在最后位置添加PATH=$PATH:/usr/local/ffmpeg/bin
编辑结束后在/etc目录下执行source profile即可生效或者
可以把可执行程序复制到bin目录下,这里选择在bin目录下创建软链接。软链接类似于Windows下的快捷方式,

如果原可执行程序被删除了,软链接也不能继续使用,而硬链接则可以继续使用。创建链接命令如下:

sudo ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/local/bin/
sudo ln -s /usr/local/ffmpeg/bin/ffprobe /usr/local/bin/
sudo ln -s /usr/local/ffmpeg/bin/ffserver /usr/local/bin/

路径处理

安装完成后在/usr/local/ffmpeg出现三个目录:

  • bin:可执行文件目录
  • lib:动态链接库目录
  • include:编程用到的头文件目录
  • share

不管是编程还是可执行程序的执行都需要依赖lib下面的动态库,修改配置文件。

通过查看/etc/ld.so.conf文件,发现里面只有一句话:

include ld.so.conf.d/*.conf

表明其包含了ld.so.conf.d下所有的conf文件,于是可以在/etc/ld.so.conf.d/创建一个新的文件ffmpeg.conf,其中之包含一句话,即为ffmpeg的lib目录:

/usr/local/ffmpeg/lib

再执行ldconfig,更新ld.so.cache,使修改生效。

ffmpeg5

 

现在ffmpeg就算安装好了 接下来就来用下它

ffmpeg -i xxx.mp4 -y -f mjpeg -ss 3 -t 1 -s 320×240 xxx.jpg

上面 这条命令是提取xxx.mp4视频中的第一秒中画面生成320×240图片 这个是我项目中需要的功能

然后用php的exec system函数调用 完美!

$a = system(“ffmpeg -i xxx.mp4 -y -f mjpeg -ss 3 -t 1 -s 320×240 xxx.jpg”,$r);

常用参数说明:

主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
-y 覆盖输出文件
视频参数:
-b 设定视频流量,默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频