http://ffmpeg.org/download.html#build-linux
安装ffmpeg
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
x264必要的库,其他无关紧要的,可以不安装
sudo ./configure --enable-shared --enable-gpl --enable-libx264 --enable-libmp3lame
sudo make
sudo make install
查看安装情况
ffmpeg -version
======错误情况======
出现:ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory
找到libavdevice.so的所在目录
/usr/local/lib/libavdevice.so
查看里面是否包含上面的目录
sudo vi /etc/ld.so.conf
如果没有,则新增
刷新引用
sudo ldconfig
======正常情况=====
ffmpeg version N-93264-g85051fe Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
configuration: --enable-shared --enable-gpl --enable-libx264 --enable-libmp3lame
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 47.102 / 58. 47.102
libavformat 58. 26.101 / 58. 26.101
libavdevice 58. 6.101 / 58. 6.101
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
安装ffmpeg-php扩展
https://sourceforge.net/projects/ffmpeg-php/files/ffmpeg-php/
https://pan.baidu.com/s/1skQTVlj
参考:
http://www.imooc.com/article/35948
//通过phpinfo() 查看使用的php所在文件夹
sudo /usr/local/php/bin/phpize
sudo ./configure --with-ffmpeg=/usr/local/bin/ffmpeg --with-php-config=/usr/local/php/bin/php-config
sudo make && make install
提示ffmpeg没有共享,卡在这里,安装不成功也没关系,php中强制指定ffmpeg
configure: error: ffmpeg headers not found. Make sure ffmpeg is compiled as shared libraries using the --enable-shared option
测试,有可能通不过,不过不要紧,php里面能执行就ok,下面这个是cakephp在调用php-ffmpeg扩展的调试语句
ffmpeg -y -i /mnt/wwwroot/application/1533629791254674.mp4 -vcodec libx264 -acodec libmp3lame -b:v 2000k -refs 6 -coder 1 -sc_threshold 40 -flags +loop -me_range 16 -subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -trellis 1 -b:a 128k -pass 1 -passlogfile /tmp/ffmpeg-passes5c77db8b876de4zirq/pass-5c77db8b878db /mnt/wwwroot/application/1551358859379056.mp4_tmp.mp4
ffmpeg-php扩展如果没有安装成功,php也可以直接调用
1.创建ffmpeg的快捷方式
ln -s 源文件 新地址(跟项目同级地址,方便调用)
例如:
ln -s /usr/local/bin/ffmpeg /mnt/wwwroot/application/ffmpeg
2.设置访问权限(如果是lnmp或者设置了访问权限 PHP_ADMIN_VALUE),如果之前没有设置,可能可以直接使用
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/mnt/wwwroot/application/:/mnt/wwwroot/application/ffprobe:/mnt/wwwroot/application/ffmpeg:/tmp/:/proc/";
}
3.代码配置
下载或者在线安装php-ffmpeg/php-ffmpeg
https://packagist.org/packages/php-ffmpeg/php-ffmpeg
/**
* 获取日志记录类
* @return \Cake\Log\Engine\FileLog
*/
private function getFileLog(){
return new FileLog([
"path"=>"/mnt/wwwroot/application/logs/",
'file' => 'ffmpeg',
]);
}
/**
* 获取视频的信息,转换成264格式,获取一张截图
* @param $realPath 视频文件绝对地址
*/
public function formatVideo($realPath){
//默认系统目录下,存了2个处理的快捷方式,项目根目录地址可以动态获取
//如果上面的“ffmpeg-php扩展”安装成功,这里就不需要,默认能找到
$ffmpegConfig=[
'ffmpeg.binaries' => '/mnt/wwwroot/application/ffmpeg',
'ffprobe.binaries' => '/mnt/wwwroot/application/ffprobe'
];
//创建日志类,也可以为null,不记录日志
$fileLog=$this->getFileLog();
// 获取时长
$ffprobe = FFProbe::create($ffmpegConfig,$fileLog);
$info = $ffprobe->format($realPath)->all();
//时长
$duration = $info['duration'];
//比特率
$bit_rate = intval($info['bit_rate'] / 1000);
//初始化转换类
$ffmpeg = FFMpeg::create($ffmpegConfig,$fileLog,$ffprobe);
$video = $ffmpeg->open($realPath);
//临时文件名称
$tmp_path = $realPath . "_tmp.mp4";
//转换成264格式,转换的方式可以有多种可以选择,主要是看自己enable了哪几个
//--enable-libx264 --enable-libmp3lame
$formart = new X264("libmp3lame","libx264");
if ($bit_rate > 2000) {
//如果比特率太高,适当的降低一些
$formart->setKiloBitrate(2000);
}
// 转换如果能成功,保存到了$tmp_path
$video->save($formart, $tmp_path);
//上传$tmp_path到oss或者另存为到其他目录
//=================获取截图=====================
$thrumbPath = $realPath . ".jpg";
// 提取图像
//TimeCode::fromSeconds(0) 表示第0秒,
//TimeCode::fromString('12:15') 表示具体时间点
$frame = $video->frame(TimeCode::fromSeconds(0));
//保存截图,另存为到指定目录
$frame->save($thrumbPath);
//最终得到
//$tmp_path 转换后文件
//$thrumbPath 提取的截图
}