美文网首页
FFMpeg for PHP

FFMpeg for PHP

作者: 济夏 | 来源:发表于2019-01-23 14:55 被阅读8次

    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

    相关文章

      网友评论

          本文标题:FFMpeg for PHP

          本文链接:https://www.haomeiwen.com/subject/yqgjjqtx.html