cakephp使用php-ffmpeg调用ffmpeg处理视频和音频

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    提取的截图
}

 

你可能感兴趣的:(Cakephp,安装)