Larave5.7使用PHP-FFMpeg处理视频文件

安装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上也都可以找到。

你可能感兴趣的:(PHP)