PHP FFMpeg documentation
========================

Introduction
------------

PHP-FFmpeg is an object oriented PHP wrapper for FFmpeg (AVconv on recent Linux
distribution). This tool gives access to the tools provided by FFmpeg such as
FFprobe and FFmpeg. These are the two binary currently supported by PHP-FFmpeg.

This library depends on `Symfony Process Component <https://github.com/symfony/process>`_
and `Monolog <https://github.com/Seldaek/monolog>`_.

Design
------

This library is designed to deal with legacy binaries of FFMpeg. It does not rely
on the FFmpeg extension.

This library is object oriented, this means that nearly everything is an object,
or ought to be. So you won't find any out of-the-box function to extract
images or encode video. This design is headed for tests and a fail fast behavior.
We hope you'll enjoy it !

Installation
------------

We rely on `composer <http://getcomposer.org/>`_ to use this library. If you do
no still use composer for your project, you can start with this ``composer.json``
at the root of your project:

.. code-block:: json

    {
        "require": {
            "php-ffmpeg/php-ffmpeg": "master"
        }
    }

Install composer :

.. code-block:: bash

    # Install composer
    curl -s http://getcomposer.org/installer | php
    # Upgrade your install
    php composer.phar install

You now just have to autoload the library to use it :

.. code-block:: php

    <?php
    require 'vendor/autoload.php';

This is a very short intro to composer.
If you ever experience an issue or want to know more about composer,
you will find help on their  website
`http://getcomposer.org/ <http://getcomposer.org/>`_.

Basic Usage
-----------

.. code-block:: php

    <?php
    use Monolog\Logger;
    use Monolog\Handler\NullHandler;
    use FFMpeg\FFMpeg;

    // Create a logger
    $logger = new Logger('MyLogger');
    $logger->pushHandler(new NullHandler());

    // You have to pass a Monolog logger
    // This logger provides some usefull infos about what's happening
    $ffmpeg = FFMpeg::load($logger);

    // open a video, extract an image at second 5 and 12 then close
    $ffmpeg->open('Video.mpeg')
           ->extractImage(5, 'first-screenshot.jpg')
           ->extractImage(12, 'second-screenshot.jpg')
           ->close();

Process Timeout
---------------

PHP-FFMpeg runs ffmpeg commands to processs your medias. A default timeout of
60 seconds is set, but you can override this by passing a second argument load :

.. code-block:: php

    <?php
    $ffmpeg = FFMpeg::load($logger, 500);

    // 500
    echo $ffmpeg->getTimeOut();

You can also set and get the timeout with the appropriate getter and setter :

.. code-block:: php

    <?php
    $ffmpeg->setTimeout(200);

    // 200
    echo $ffmpeg->getTimeOut();

.. note::

    To disable timeout, set its value to 0.

Recipes
-------

You'll find usefull recipes in our :doc:`Recipes`

.. toctree::
   :maxdepth: 4

   Recipes

Handling Exceptions
-------------------

PHP-FFMpeg throws 4 different types of exception :

- ``\FFMpeg\Exception\BinaryNotFoundException`` is thrown when no acceptable
  pdf2text binary is found.
- ``\FFMpeg\Exception\InvalidArgumentException`` is thrown when an invalid
  argument (file, format, ...) is provided
- ``\FFMpeg\Exception\LogicException`` which extends SPL LogicException
- ``\FFMpeg\Exception\RuntimeException`` which extends SPL RuntimeException

All these Exception implements ``\FFMpeg\Exception\Exception`` so you can catch
any of these exceptions by catching this exception interface.

Report a bug
------------

If you experience an issue, please report it in our
`issue tracker <https://github.com/alchemy-fr/PHP-FFmpeg/issues>`_. Before
reporting an issue, please be sure that it is not already reported by browsing
open issues.

When reporting, please give us information to reproduce it by giving your
platform (Linux / MacOS / Windows) and its version, the version of PHP you use
(the output of ``php --version``), the version of ffmpeg or avconv you use
(the output of ``ffmpeg -version``) and the codec configuration (``ffmpeg -formats``)

Ask for a feature
-----------------

We would be glad you ask for a feature ! Feel free to add a feature request in
the `issues manager <https://github.com/alchemy-fr/PHP-FFmpeg/issues>`_ on GitHub !

Contribute
----------

You find a bug and resolved it ? You added a feature and want to share ? You
found a typo in this doc and fixed it ? Feel free to send a
`Pull Request <http://help.github.com/send-pull-requests/>`_ on GitHub, we will
be glad to merge your code.

Run tests
---------

PHP-FFMpeg relies on `PHPUnit <http://www.phpunit.de/manual/current/en/>`_ for
unit tests. To run tests on your system, ensure you have PHPUnit installed,
and, at the root of PHP-FFMpeg, execute it :

.. code-block:: bash

    phpunit

About
-----

PHP-FFMpeg has been written by Romain Neutron @ `Alchemy <http://alchemy.fr/>`_
for `Phraseanet <https://github.com/alchemy-fr/Phraseanet>`_, our DAM software.
Try it, it's awesome !

License
-------

PHP-FFMpeg is licensed under the `MIT License <http://opensource.org/licenses/MIT>`_
