FFMpeg for PHP

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

FFMpeg for PHP_第1张图片

composer require php-ffmpeg/php-ffmpeg

FFMpeg for PHP_第2张图片
FFMpeg for PHP_第3张图片

OK 。PHP-ffmpeg已经安装到了php-ffmpeg目录下。

至于ffmpeg在win7上的安装这里不在赘述。

验证准备

在D://xampp/htdocs/php-ffmpeg下创建index.php文件来学习下这个包的使用。

FFMpeg for PHP_第4张图片
FFMpeg for PHP_第5张图片

将事先准备好的MP4文件放在项目根目录下为后面做验证测试。

FFMpeg for PHP_第6张图片

验证

基本应用

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');


FFMpeg for PHP_第7张图片

这里只支持wmv的格式转换,其它的暂不支持。均为error。

截图

FFMpeg for PHP_第8张图片
FFMpeg for PHP_第9张图片

旋转

$video->filters()->rotate($angle);

 $angle 的参数必须是下面的一个常量:

FFMpeg\Filters\Video\RotateFilter::ROTATE_90

FFMpeg\Filters\Video\RotateFilter::ROTATE_180

FFMpeg\Filters\Video\RotateFilter::ROTATE_270

FFMpeg for PHP_第10张图片

调整尺寸

调整尺寸的过滤器需要三个参数:

$dimension, 一个 FFMpeg\Coordinate\Dimension实例

$mode, FFMpeg\Filters\Video\ResizeFilter::RESIZEMODE_* constants常量中的一个。

$useStandards, 是否强制使用最新的比率标准的布尔

 如果你想要视频处在一个非标准的比率, 你可以使用padding 过滤器 调整视频大小到想要的尺寸,包上黑色的条。

$video->filters()->pad($dimension);

FFMpeg for PHP_第11张图片
FFMpeg for PHP_第12张图片

水印

$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,

    ));

FFMpeg for PHP_第13张图片
FFMpeg for PHP_第14张图片
FFMpeg for PHP_第15张图片

帧频

改变视频的帧频

$video->filters()->framerate($framerate,

$gop);

framerate(帧频)过滤器需要两个参数:

$framerate,  FFMpeg\Coordinate\Framerate的实例

$gop, aGOPvalue (integer)

FFMpeg for PHP_第16张图片
FFMpeg for PHP_第17张图片

同步

同步的音频和视频

一些容器使用延迟可能会导致不同步的输出。过滤器可以解决这个问题。

$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实例, 指定要持续的时间

FFMpeg for PHP_第18张图片
FFMpeg for PHP_第19张图片

元数据

向音频文件中添加元数据。你可以数组的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图片。

FFMpeg for PHP_第20张图片

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

FFMpeg for PHP_第21张图片

你可能感兴趣的:(FFMpeg for PHP)