| docs | ||
| src/FFMpeg | ||
| tests | ||
| .gitignore | ||
| .travis.yml | ||
| buildAPI.sh | ||
| CHANGELOG.md | ||
| composer.json | ||
| composer.lock | ||
| LICENSE | ||
| phpunit-functional.xml.dist | ||
| phpunit.xml.dist | ||
| README.md | ||
| sami_configuration.php | ||
| vendors.win.php | ||
#PHP FFmpeg
An Object Oriented library to convert video/audio files with FFmpeg / AVConv.
Check another amazing repo : PHP FFMpeg extras, you will find lots of Audio/Video formats there.
Installation
The recommended way to install PHP-FFMpeg is through Composer.
{
    "require": {
        "php-ffmpeg/php-ffmpeg": "~0.3.0"
    }
}
Basic Usage
$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open('video.mpg');
$video
    ->filters()
    ->resize(new FFMpeg\Coordinate\Dimension(320, 240))
    ->synchronize();
$video
    ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
    ->save('frame.jpg');
$video
    ->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')
    ->save(new FFMpeg\Format\Video\WMV(), 'export-wmv.wmv')
    ->save(new FFMpeg\Format\Video\WebM(), 'export-webm.webm');
Documentation
This documentation is an introduction to discover the API. It's recommended to browse the source code as it is self-documented.
FFMpeg
FFMpeg\FFMpeg is the main object to use to manipulate medias. To build it,
use the static FFMpeg\FFMpeg::create :
$ffmpeg = FFMpeg\FFMpeg::create();
FFMpeg will autodetect ffmpeg and ffprobe binaries. If you want to give binary
paths explicitely, you can pass an array as configuration. A Psr\Logger\LoggerInterface
can also be passed to log binary executions.
$ffmpeg = FFMpeg\FFMpeg::create(array(
    'ffmpeg.binaries'  => '/opt/local/ffmpeg/bin/ffmpeg',
    'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe',
    'timeout'          => 3600, // The timeout for the underlying process
    'ffmpeg.threads'   => 12,   // The number of threads that FFMpeg should use
), $logger);
Manipulate media
FFMpeg\FFMpeg creates media based on file paths. To open a file path, use the
FFMpeg\FFMpeg::open method.
$ffmpeg->open('video.mpeg');
Two types of media can be resolved : FFMpeg\Media\Audio and FFMpeg\Media\Video.
A third type, FFMpeg\Media\Frame, is available through videos.
Video
FFMpeg\Media\Video can be transcoded, ie : change codec, isolate audio or
video. Frames can be extracted.
Transcoding
You can transcode videos using the FFMpeg\Media\Video:save method. You will
pass a FFMpeg\Format\FormatInterface for that.
$format = new Format\Video\X264();
$format->on('progress', function ($video, $format, $percentage) {
    echo "$percentage % transcoded";
});
$video->save($format, 'video.avi');
Transcoding progress can be monitored in realtime, see Format documentation below for more informations.
Extracting image
You can extract a frame at any timecode using the FFMpeg\Media\Video::frame
method.
This code return a FFMpeg\Media\Frame instance corresponding to the second 42.
You can pass any FFMpeg\Coordinate\TimeCode as argument, see dedicated
documentation below for more information.
$frame = $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(42));
$frame->save('image.jpg');
Filters
You can apply filters on FFMpeg\Media\Video with the FFMpeg\Media\Video::addFilter
method. Video accepts Audio and Video filters.
You can build your own filters and some are bundled in PHP-FFMpeg - they are
accessible through the FFMpeg\Media\Video::filters method.
Filters are chainable
$video
    ->filters()
    ->resize($dimension, $mode, $useStandards)
    ->framerate($framerate, $gop)
    ->synchronize();
Resize
Resizes a video to a given size.
$video->filters()->resize($dimension, $mode, $useStandards);
The resize filter takes three parameters :
- $dimension, an instance of- FFMpeg\Coordinate\Dimension
- $mode, one of the constants- FFMpeg\Filters\Video\ResizeFilter::RESIZEMODE_*constants
- $useStandards, a boolean to force the use of the nearest aspect ratio standard.
Framerate
Change the frame rate of the video.
$video->filters()->framerate($framerate, $gop);
The framerate filter takes two parameters :
- $framerate, an instance of- FFMpeg\Coordinate\Framerate
- $gop, a GOP value (integer)
Synchronize
Synchronizes audio and video.
Some containers may use a delay that results in desynchronized outputs. This filters solves this issue.
$video->filters()->synchronize();
Audio
FFMpeg\Media\Audio can be transcoded, ie : change codec, isolate audio or
video. Frames can be extracted.
Transcoding
You can transcode audios using the FFMpeg\Media\Audio:save method. You will
pass a FFMpeg\Format\FormatInterface for that.
$format = new Format\Audio\Flac();
$format->on('progress', function ($$audio, $format, $percentage) {
    echo "$percentage % transcoded";
});
$audio->save($format, 'track.flac');
Transcoding progress can be monitored in realtime, see Format documentation below for more informations.
Filters
You can apply filters on FFMpeg\Media\Audio with the FFMpeg\Media\Audio::addFilter
method. It only accepts audio filters.
You can build your own filters and some are bundled in PHP-FFMpeg - they are
accessible through the FFMpeg\Media\Audio::filters method.
Resample
Resamples an audio file.
$audio->filters()->resample($rate);
The resample filter takes two parameters :
- $rate, a valid audio sample rate value (integer)
Frame
A frame is a image at a timecode of a video ; see documentation above about frame extraction.
You can save frames using the FFMpeg\Media\Frame::save method.
$frame->save('target.jpg');
This method has a second optional boolean parameter. Set it to true to get accurate images ; it takes more time to execute.
Formats
A format implements FFMpeg\Format\FormatInterface. To save to a video file,
use FFMpeg\Format\VideoInterface, and FFMpeg\Format\AudioInterface for
audio files.
Format can also extends FFMpeg\Format\ProgressableInterface to get realtime
informations about the transcoding.
Predefined formats already provide progress informations as events.
$format = new Format\Video\X264();
$format->on('progress', function ($video, $format, $percentage) {
    echo "$percentage % transcoded";
});
$video->save($format, 'video.avi');
The callback provided for the event can be any callable.
Create your own format
The easiest way to create a format is to extend the abstract
FFMpeg\Format\Video\DefaultVideo and FFMpeg\Format\Audio\DefaultAudio.
and implement the following methods.
class CustomWMVFormat extends FFMpeg\Format\Video\DefaultVideo
{
    public function __construct($audioCodec = 'wmav2', $videoCodec = 'wmv2')
    {
        $this
            ->setAudioCodec($audioCodec)
            ->setVideoCodec($videoCodec);
    }
    public function supportBFrames()
    {
        return false;
    }
    public function getAvailableAudioCodecs()
    {
        return array('wmav2');
    }
    public function getAvailableVideoCodecs()
    {
        return array('wmv2');
    }
}
Coordinates
FFMpeg use many units for time and space coordinates.
- FFMpeg\Coordinate\AspectRatiorepresents an aspect ratio.
- FFMpeg\Coordinate\Dimensionrepresent a dimension.
- FFMpeg\Coordinate\FrameRaterepresent a framerate.
- FFMpeg\Coordinate\Pointrepresent a point.
- FFMpeg\Coordinate\TimeCoderepresent a timecode.
##Using with Silex Microframework
Service provider is easy to set up :
$app = new Silex\Application();
$app->register(new FFMpeg\FFMpegServiceProvider());
$video = $app['ffmpeg']->open('video.mpeg');
Available options are as follow :
$app->register(new FFMpeg\FFMpegServiceProvider(), array(
    'ffmpeg.configuration' => array(
        'ffmpeg.threads'   => 4,
        'ffmpeg.timeout'   => 300,
        'ffmpeg.binaries'  => '/opt/local/ffmpeg/bin/ffmpeg',
        'ffprobe.timeout'  => 30,
        'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe',
    ),
    'ffmpeg.logger' => $logger,
));
API Browser
Browse the API
License
This project is licensed under the MIT license.
