FFMpeg for PHP
PHP使用FFMpeg来转换视频格式。
本质是使用ffmpeg服务来执行的,而非通过静态文件dll扩展执行。
Github上搜索FFMPEG,到https://github.com/PHP-FFMpeg/PHP-FFMpeg。
For Windows users : Please find thebinaries at http://ffmpeg.zeranoe.com/builds/
以下操作,是win7 64b php5.5.30环境下进行的。
composer安装
建议通过Composer来安装PHP-FFMpeg
在web服务器根目录下创建文件夹:mkdir php-ffmpeg
composer require php-ffmpeg/php-ffmpeg
OK 。PHP-ffmpeg已经安装到了php-ffmpeg目录下。
至于ffmpeg在win7上的安装这里不在赘述。
验证准备
在D://xampp/htdocs/php-ffmpeg下创建index.php文件来学习下这个包的使用。
将事先准备好的MP4文件放在项目根目录下为后面做验证测试。
验证
基本应用
require 'vendor/autoload.php';
$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open('./ffmpeg.wmv');
$video
->filters()
->resize(new FFMpeg\Coordinate\Dimension(320, 240))
->synchronize();
$video
->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
->save('keep.jpg');
$video
->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')
->save(new FFMpeg\Format\Video\WMV(), 'export-wmv.wmv')
->save(newFFMpeg\Format\Video\WebM(), 'export-webm.webm');
这里只支持wmv的格式转换,其它的暂不支持。均为error。
截图
旋转
$video->filters()->rotate($angle);
$angle 的参数必须是下面的一个常量:
FFMpeg\Filters\Video\RotateFilter::ROTATE_90
FFMpeg\Filters\Video\RotateFilter::ROTATE_180
FFMpeg\Filters\Video\RotateFilter::ROTATE_270
调整尺寸
调整尺寸的过滤器需要三个参数:
$dimension, 一个 FFMpeg\Coordinate\Dimension实例
$mode, FFMpeg\Filters\Video\ResizeFilter::RESIZEMODE_* constants常量中的一个。
$useStandards, 是否强制使用最新的比率标准的布尔
如果你想要视频处在一个非标准的比率, 你可以使用padding 过滤器 调整视频大小到想要的尺寸,包上黑色的条。
$video->filters()->pad($dimension);
水印
$video
->filters()
->watermark($watermarkPath, array(
'position' => 'relative',
'bottom' => 50,
'right' => 50,
));
watermark 过滤器需要两个参数:
$watermarkPath,你水印文件的路径; $coordinates, 一个定义水印放置位置的数组。你可以使用相对路径像上面展示的那样。或者使用绝对路径像这样:
$video
->filters()
->watermark($watermarkPath, array(
'position' => 'absolute',
'x' => 1180,
'y' => 620,
));
帧频
改变视频的帧频
$video->filters()->framerate($framerate,
$gop);
framerate(帧频)过滤器需要两个参数:
$framerate, FFMpeg\Coordinate\Framerate的实例
$gop, aGOPvalue (integer)
同步
同步的音频和视频
一些容器使用延迟可能会导致不同步的输出。过滤器可以解决这个问题。
$video->filters()->synchronize();
修剪
在想要的点减掉视频。
$video->filters()->clip(FFMpeg\Coordinate\TimeCode::fromSeconds(30),
FFMpeg\Coordinate\TimeCode::fromSeconds(15));
The clip filter(修剪的过滤器)需要两个参数:
$start, 一个FFMpeg\Coordinate\TimeCode实例, 指定开始剪切的点
$duration, 可选, 一个 FFMpeg\Coordinate\TimeCode实例, 指定要持续的时间
元数据
向音频文件中添加元数据。你可以数组的key=value键值对的形式添加你想要的元数据。如果过滤器中没有任何参数传递进来,那么所有的元数据将被从输入文件中删除。目前支持的数据有title, artist, album, artist, composer, track, year, description, artwork
$audio->filters()->addMetadata(["title" => "Some Title", "track" => 1]);
//remove all metadata and video streams from audio file
$audio->filters()->addMetadata();
向音频文件中添加artwork
$audio->filters()->addMetadata(["artwork" => "/path/to/image/file.jpg"]);
注意: 当前ffmpeg (version 3.2.2) only
supports 只支持 .mp3 文件的artwork输出
Gif
GIf是从视频文件中提取的一系列的动画图片。
你可以使用 FFMpeg\Media\Gif::save 方法来保存gif文件。
$video = $ffmpeg->open( '/path/to/video' );
$video
->gif(FFMpeg\Coordinate\TimeCode::fromSeconds(2), new FFMpeg\Coordinate\Dimension(640, 480), 3)
->save($new_file);
这个方法有一个可选的布尔类型的参数,就是动画的持续时间。如果设置的话,可以得到一个确切的gif图片。
Formats(格式)
格式要实现 FFMpeg\Format\FormatInterface。 用FFMpeg\Format\VideoInterface来保存视频文件, 用 FFMpeg\Format\AudioInterface 来保存音频文件。
FFMpeg\Format\ProgressableInterface的话可以获得转码的实时信息。
预定义的格式已经提供了事件的过程信息。
$format = new Format\Video\X264();
$format->on('progress', function ($video,$format, $percentage) {
echo"$percentage % transcoded";
});
$video->save($format, 'video.avi');
为事件提供的回调函数可以随时调用。
Add additional parameters
你可以根据你的视频格式为你的编码提供额外的参数。
setAdditionalParameters 方法的参数是一个数组。
$format = new Format\Video\X264();
$format->setAdditionalParameters(array('foo','bar'));
$video->save($format, 'video.avi');
创建你自己的格式
创建一种新的格式最简单的方法就是集成抽象类 FFMpeg\Format\Video\DefaultVideo and FFMpeg\Format\Audio\DefaultAudio,并且实现下面的方法。
class CustomWMVFormat extends FFMpeg\Format\Video\DefaultVideo
{
publicfunction __construct($audioCodec = 'wmav2', $videoCodec = 'wmv2')
{
$this
->setAudioCodec($audioCodec)
->setVideoCodec($videoCodec);
}
publicfunction supportBFrames()
{
return false;
}
publicfunction getAvailableAudioCodecs()
{
return array('wmav2');
}
publicfunction getAvailableVideoCodecs()
{
return array('wmv2');
}
}
Coordinates(坐标)
FFMpeg 使用很多单元来确定时间和空间坐标。
FFMpeg\Coordinate\AspectRatio 表示长宽比
FFMpeg\Coordinate\Dimension 表示一个维度
FFMpeg\Coordinate\FrameRate 表示帧速率
FFMpeg\Coordinate\Point 表示一个点
FFMpeg\Coordinate\TimeCode 表示一个时间码
FFProbe
FFMpeg\FFMpeg 内部使用FFMpeg\FFProbe来检查媒体文件。你也可以用它提取元数据。
$ffprobe = FFMpeg\FFProbe::create();
$ffprobe
->streams('/path/to/video/mp4') // extracts streams informations
->videos() // filters video streams
->first() // returns the first video stream
->get('codec_name'); // returns the codec_name property
$ffprobe = FFMpeg\FFProbe::create();
$ffprobe
->format('/path/to/video/mp4') // extracts file informations
->get('duration'); // returns the duration property