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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容