PHP使用FFMPEG进行音频视频操作(音频声道转换)Win AND Linux

一、Win里进行操作:

①先下载FFMPEG第三方包:http://ffmpeg.org/download.html#build-windows

下载完成后:解压 -> 打开里面有个bin文件打开->

可以在cmd里到:比我的是:执行C:\Users\lbxr\Desktop\ffmpeg\bin>ffmpeg -i  a.mp3   -ac 2  -f mp3 b.mp3   (意思是吧a.mp3里的声道(-ac 2)转成双声道保存并生成b.mp3)

php可以下载  操作ffmpeg 的类库:https://github.com/PHP-FFMpeg/PHP-FFMpeg/

 

也可以composer进行安装:到项目根目录:   composer require php-ffmpeg/php-ffmpeg

composer安装完成后会:vendor在里面多出来个php-ffmpeg

二、Linux上配置FFMPEG;我本地用的filezilla进行上传:上传到Linux:  /usr/include/里进行编译操作:FFMPEG保存到/usr/local/ffmpeg里

①:下载汇编编辑器:yasm (如果有的话可以不下载) :下载地址:http://yasm.tortall.net/Download.html

上传到linux服务器上:进行操作

  1. tar -xvzf yasm-1.3.0.tar.gz

  2. cd yasm-1.3.0/

  3. ./configure

  4. make && make install

②:因为FFmpeg默认只支持mp3的解码,不支持mp3编码,所以先安装mp3编码库。

下载地址:https://sourceforge.net/projects/lame/files/lame/

上传到linux服务器上:进行操作

1:  tar -zxvf lame-3.100.tar.gz
2:  cd lame-3.100
3:  ./configure
4:  make && make install

③:FFmpeg的安装包下载地址http://ffmpeg.org/

上传到linux服务器上:进行操作   --prefix=是你将要保存的位置(我保存的是:/usr/local/ffmpeg)

  1. tar -xjvf ffmpeg-4.2.1.tar.bz2

  2. cd ffmpeg-4.2.1/

  3. ./configure --enable-shared --enable-libmp3lame --prefix=/usr/local/ffmpeg

  4. make

  5. make install

编译完成后进入:/usr/local/ffmpeg里出现:bin,include,lib,share这4个目录,进入bin目录执行   ./ffmpeg

出现:

出现这个是你当前运行ffmpeg但是没有找到动态类库:需要配置环境变量

vim /etc/profile

在末尾添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ffmpeg/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

然后保存退出

执行:source /etc/profile   使其配置生效

现在就OK了。

下面介绍一比对参数:

-ar 设置音频采样率 HZ  ,-ab 设置比特率   ,-vn 取消视频    , -ac 设置声道数,1就是单声道,2就是立体声,

转换单声道的TVrip可以用1(节省一半容量),高品质的DVDrip就可以用2
ffmpeg -i \20190701.mp3 -vn -ar 16000 -ac 2 -ab 192 -f mp3 \20190701.mp3  这样就ok了;

不过我们可能会在任何一个地方用:需要配置全局变量

 export PATH=$PATH:/usr/local/ffmpeg/bin  (路径自己修改)  这样就ok了

可以打印:export   输出:看到里面的ffmpeg路径就ok了,现在可以在系统的任何地方操作ffmpeg了

 

 

三、下面我开始说框架:TP里使用FFMPEG

安装php-ffmpeg

composer安装:项目根目录:(推荐使用composer)

composer require php-ffmpeg/php-ffmpeg

github下载:https://github.com/PHP-FFMpeg/PHP-FFMpeg/

在使用类的头顶使用:

require '../vendor/autoload.php';

use FFMpeg\FFMpeg;
use FFMpeg\FFProbe;
use FFMpeg\Format\Audio\Mp3;//这个引入是因为我操作是MP3文件,你可以根据操作音频、视频类型进行引入

 

引入成功后:代码(win版使用类)

这个是ffmpeg官网进行下载的bin里的加载类

成功后可以打印一下会输出实例的对象操作类;

$ffmpeg = FFMpeg::create([
    'ffmpeg.binaries'  => 'C:/Users/lbxr/Desktop/ffmpeg/bin/ffmpeg.exe',
    'ffprobe.binaries' => 'C:/Users/lbxr/Desktop/ffmpeg/bin/ffprobe.exe',
]);
$audio = $ffmpeg->open($FileName);
$format = new Mp3();
$format->on('progress', function ($audio, $format, $percentage) {
    echo "$percentage % 进度";
});
$format->setAudioChannels(2);
$audio->save($format, $NameF);

如果想学习更多的操作可以看这个:https://blog.csdn.net/a9925/article/details/80334700

代码(linux版使用类)

上面我们已经在linux上进行了编译ffmpeg类,我们只需要把路径引进来:

ok流程就和上面一样了;

 

下面讲讲:nginx和apache里我遇到的问题

测试服务器我是用的apache代理服务器:

里面一般汇报:your ffprobe version is too old and does not support `-help` option, please upgrade

我第一反应应该是服务器里的环境变量或者动态库没有加载试验才报这个:

最后发现需要在apache里的envvars文件里添加把动态加载库放到这,项目进行转换的时候会以apache的身份进行操作系统,所以他报错告诉我们ffprobe太老或者找不到,其实就是找不到;(重启apache:   /usr/local/apache2/bin/apachectl restart)apachectl找到这个(位置不一定一样);

生成服务器:nginx代理服务器:(重启nginx命令:/usr/sbin/nginx -s reload)

但是生成服务器使用的是nginx,nginx里没有envvars这个文件:这就比较坑了;

但是不要慌:

vi /etc/ld.so.conf

转换的时候会用nginx的身份进行转换,虽然我们配置了环境变量,但是nginx用户还是加载不了动态库。我们直接在动态库加载配置了加上ffmpeg配置:

这样就直接在加载动态库的时候直接去找,不用通过环境变量里的配置去加载动态库了。这样发现就解决了。

这样项目安全上线。以后还是要多研究研究啊

 

 

补充:

安装完以后只有root用户可以使用,但是其他用户不能使用;那肯定就是权限的问题了。我们应该赋予使用用户权限;或者把当前ffmpeg执行的权限给使用用户;执行ffmpeg时使用绝对路径

或者先把root权限给使用用户

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章