做音频合成的时候找到的一个php操作ffmpeg 的类库。GitHub地址:https://github.com/PHP-FFMpeg/PHP-FFMpeg/。本文的例子大部分都是上面的
在使用之前请安装好 FFMpeg 。如何安装?请看 FFmpeg 安装教程。
使用composer快速安装 > composer require php-ffmpeg/php-ffmpeg。
注意:请在 php.ini 中开启这两个函数proc_open,proc_get_status。找到 disable_functions 将里面的这两个函数去掉就行了
目录说明
/usr/loca/bin ffmpeg 的执行目录
这里主要用 1080.mp4 这个视频做测试,下面就是这个 18 秒的视频(chrome 谷歌浏览器不显示播放器是因为https 的站不能使用未加密的http资源,唉)
https://www.bilibili.com/video/av17244788/
使用时请配置 ffmpeg,ffprobe 的执行文件绝对路径。我定义了一些测试用的视频音频文件
1 2 3 4 5 6 7 8 9 10 11 12 |
$path = [ 'ffmpeg.binaries' => '/usr/local/bin/avconv' , 'ffmpeg.binaries' => '/usr/local/bin/ffmpeg' , 'ffprobe.binaries' => '/usr/local/bin/avprobe' , 'ffprobe.binaries' => '/usr/local/bin/ffprobe' , ]; $ffmpeg = FFMpeg\FFMpeg::create( $path ); $a1 = '/mnt/hgfs/www/test/a1.mp3' ; $v1 = '/mnt/hgfs/www/test/v1.mp4' ; $v2 = '/mnt/hgfs/www/test/v2.mp4' ; $v3 = '/mnt/hgfs/www/test/v3.mp4' ; $v1080 = '/mnt/hgfs/www/test/1080.mp4' ; |
1、拼接视频/音频
1 2 3 |
$newFile = '/mnt/hgfs/www/test/video.mp4' ; $video = $ffmpeg ->open( $v1 ); $video ->concat( array ( $v1 , $v2 , $v3 ))->saveFromSameCodecs( $newFile , TRUE); |
若是已存在合成的新文件 ($newFile 已存在),将会报错,请确保同一目录下不存在相同的文件
2、提取图像
提取一张
1 2 3 |
$video = $ffmpeg ->open( $v1080 ); $frame = $video ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(2)); //提取第几秒的图像 $frame ->save( 'image.jpg' ); |
抽取多张
1 2 3 4 5 6 |
$video = $ffmpeg ->open( $v1080 ); $video ->filters() ->extractMultipleFrames(FFMpeg\Filters\Video\ExtractMultipleFramesFilter::FRAMERATE_EVERY_SEC, '/mnt/hgfs/www/test/image/' ) ->synchronize(); $video ->save( new FFMpeg\Format\Video\X264( 'libfdk_aac' ), '/mnt/hgfs/www/test/v2new.mp4' ); |
注意:此方法会抽取对应的图片帧,而且每次都提取 400 张,不知道是不是我参数设置的问题(试了 FRAMERATE_EVERY_SEC,FRAMERATE_EVERY_2SEC,FRAMERATE_EVERY_10SEC)
3、生成音频波形
1 2 3 |
$audio = $ffmpeg ->open( $a1 ); $waveform = $audio ->waveform(640, 120, array ( '#00FF00' ));<
|