安装PHP-FFMpeg扩展
composer require php-ffmpeg/php-ffmpeg
基本使用
1、获取视频信息
//1.获取ffmpeg实例
$ffmpeg = FFMpeg::create(array(
'ffmpeg.binaries' => '/usr/bin/ffmpeg',//安装的ffmpeg服务绝对地址
'ffprobe.binaries' => '/usr/bin/ffprobe',//安装的ffprobe服务绝对地址
'timeout' => 3600, // The timeout for the underlying process
'ffmpeg.threads' => 12, // The number of threads that FFMpeg should use
));
//打开视频文件
$video = $ffmpeg->open('/path/to/file');
//视频的视频信息
$video_info = $video->getStreams()->videos()->first()->all();
//单独获取某一个
$profile = $video->getStreams()->videos()->first()->get('profile');
//获取视频尺寸有单独的方法
$dimensions=$video->getStreams()->videos()->first()->getDimensions();
//视频的音频信息
$audio_info_rate = $video->getStreams()->audios()->first()->all();
//单独获取某一个
$sample_rate = $video->getStreams()->audios()->first()->get('sample_rate');
2.修改视频参数
//设置视频的画质(profile)
$video->getStreams()->audios()->first()->set('profile', 'high');
//设置音频的参数保存后会没有修改成功,当时做的时候花费了一点时间,最后用下面的当时修改了音频的采样率
$video->filters()->resample('44100');
3.缩放视频尺寸
$video->filters()->resize(new\FFMpeg\Coordinate\Dimension($dimension),\FFMpeg\Filters\Video\ResizeFilter::$mode, $forceStandards);
/*
参数说明:
resize(Dimension $dimension, $mode = ResizeFilter::RESIZEMODE_FIT, $forceStandards = true)
$dimension 调整后的视频宽高
$mode 四种缩放模式
RESIZEMODE_FIT 按给定值调整
RESIZEMODE_INSET 在给定的尺寸内调整大小,可能是按宽为基准(高等比缩放),也可能是按高为基准(宽等比缩放)
RESIZEMODE_SCALE_WIDTH 高为给定值,宽按比例缩放
RESIZEMODE_SCALE_HEIGHT 宽为给定值,高按比例缩放
$forceStandards ture / false,是否强制使用最近的纵横比标准
*/
$video->filters()->pad(new \FFMpeg\Coordinate\Dimension(width,height));//不够加黑边
4.裁剪视频
$video = $ffmpeg->open('/path/to/file');
$video->filters()->crop(new FFMpeg\Coordinate\Point($x, $y, $dynamic), new FFMpeg\Coordinate\Dimension($dimensions));
$video->save(new FFMpeg\Format\Video\X264('libfdk_aac'), '/save/to/path')
/*
参数说明
$x 和 $y 裁剪的起始坐标,
$dynamic 是否动态裁剪
$dimensions 裁剪后的尺寸
*/
5.视频加水印
$video = $ffmpeg->open('/path/to/file');
$watermarkPath = '/path/to/watermark';
$absolute = ['x' => 0,'y' => 0];
$relative = [
'position' => 'relative',
'bottom' => 0,
'right' => 0
];
$video->filters()->watermark($watermarkPath, $absolute);
$video->save(new FFMpeg\Format\Video\X264('libfdk_aac'), '/save/to/path');
6.从视频中提取静态图
$video = $ffmpeg->open('/path/to/file');
$frame = new FFMpeg\Media\Frame($video, FFMpeg\Driver\FFMpegDriver::load($path), FFMpeg\FFProbe::create($path), FFMpeg\Coordinate\TimeCode::fromSeconds($time));
$frame->save(/img/save/path);
/*
参数说明
$path 驱动地址
$time 在视频的那个时间点截图
*/
7.从视频中截取动态图(gif)
$video = $ffmpeg->open($v1080);
$video->gif(FFMpeg\Coordinate\TimeCode::fromSeconds($begin), new FFMpeg\Coordinate\Dimension($dimension),$duration);
/*
参数说明
$begin 开始时间
$dimension 尺寸
$duration 持续时间
*/
8.从源视频中截取一段视频
$video = $ffmpeg->open('/path/to/file');
$clip = $video->clip(TimeCode::fromSeconds($start), TimeCode::fromSeconds($duration));
$clip->save(new X264('libfdk_aac'), '/save/to/path');
/*
参数说明
$start 开始时间
$duration 持续时间
*/
9.拼接视频
$newFile = '/path/to/v1';
$video = $ffmpeg->open($v1);
$video->concat(array($v1,$v2,$v3))->saveFromSameCodecs($newFile, TRUE);
//若视频编码不同,用下面的方法
$video->concat(array($v1,$v2,$v3))->saveFromDifferentCodecs(new X264('libfdk_aac'), $newFile);
注意事项:打开地址和保存地址最好是绝对路径,目录存在,并且有读写权限;同一目录下,如果已经存在同名文件,保存会报错。
其他操作基本上在github上也都可以找到。