ffmpeg-mappable-media/docs/source/Recipes.rst

484 lines
11 KiB
ReStructuredText
Raw Normal View History

2012-05-30 15:07:31 +02:00
Recipes
=======
2012-05-25 18:25:13 +02:00
2012-05-25 21:08:35 +02:00
Initializing FFMpeg
-------------------
2012-05-25 18:25:13 +02:00
2012-05-31 14:29:00 +02:00
In the following examples, we assume we work in an environnment where
FFMpeg has been initialized to ``$ffmpeg``; there are two ways to
initialize the environment (see below).
2012-05-25 21:08:35 +02:00
2012-05-30 15:07:31 +02:00
PHP-FFMpeg supports both ``avconv`` and legacy ``ffmpeg``. If both are installed
2012-05-31 14:29:00 +02:00
on your system, ``avconv`` will be loaded in first priority. Please read the
dedicated chapter below if you want to load ``FFMpeg``.
2012-05-30 15:07:31 +02:00
Load FFMpeg automatically
^^^^^^^^^^^^^^^^^^^^^^^^^
2012-05-25 21:08:35 +02:00
The easiest way to initialize ``FMpeg`` it is to call the loader ; this will
look in your PATH environment variable to find ffmpeg/avconv binary :
.. 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);
2012-05-31 14:29:00 +02:00
.. note:: FFMpeg and FFProbe both requires a logger for giving feedback about
2012-05-30 15:07:31 +02:00
what's happening. By passing a NullHandler to the logger, you will disable
the log system.
2012-05-25 21:08:35 +02:00
Use custom binary
^^^^^^^^^^^^^^^^^
You can also initialize with a custom path to the binary :
.. code-block:: php
<?php
2012-05-28 14:29:20 +02:00
$ffmpeg = new FFMpeg('/usr/local/src/ffmpeg/bin/ffmpeg', $logger);
2012-05-25 21:08:35 +02:00
2012-05-30 18:43:38 +02:00
Formats
-------
2012-05-25 21:08:35 +02:00
2012-05-31 14:29:00 +02:00
PHP-FFMpeg provides a set of predefined audio and video formats. These formats
are usefull, but you'll probably need to define your own format with their own
2012-05-30 18:43:38 +02:00
resize rules, etc...
2012-05-30 15:07:31 +02:00
2012-05-31 14:29:00 +02:00
This section describe how to use media formats, and how to define them.
2012-05-30 15:07:31 +02:00
2012-05-30 18:43:38 +02:00
.. note:: Defining a format is just about implementing interfaces.
2012-05-30 15:07:31 +02:00
2012-05-31 14:29:00 +02:00
.. _video-reference:
2012-05-30 18:43:38 +02:00
Video
^^^^^
2012-05-25 21:08:35 +02:00
2012-05-30 18:43:38 +02:00
This section describes video processing and Interfaces for building video
2012-05-31 14:29:00 +02:00
formats. As Video is an extension of audio, all these features can be combined
with audio features (see :ref:`dedicated audio section<audio-reference>`).
2012-05-30 18:43:38 +02:00
Simple transcoding
++++++++++++++++++
To transcode a video, you have to pass the target format to FFMpeg.
2012-05-25 21:08:35 +02:00
The following example initialize a Ogg format and encodes a `Video.mpeg` to a
target file `file.ogv` :
.. code-block:: php
<?php
use FFMpeg\Format\Video\Ogg;
$oggFormat = new Ogg();
$ffmpeg->open('Video.mpeg')
->encode($oggFormat, 'file.ogv')
->close();
2012-05-30 15:07:31 +02:00
.. note:: ``FFmpeg`` methods always return the object itself so you can chain
2012-05-28 15:36:27 +02:00
multiple methods.
2012-05-28 14:29:20 +02:00
2012-05-30 18:43:38 +02:00
HTML5
+++++
2012-05-25 18:25:13 +02:00
2012-05-31 14:29:00 +02:00
PHP-FFMpeg provides three video formats out of the box : HTML5 video formats
2012-05-25 21:08:35 +02:00
- ``FFMpeg\Format\Video\WebM``
- ``FFMpeg\Format\Video\X264``
- ``FFMpeg\Format\Video\Ogg``
.. code-block:: php
<?php
use FFMpeg\Format\Video;
$webMFormat = new Video\WebM();
$webMFormat->setDimensions(320, 240)
->setFrameRate(15)
->setGopSize(25);
2012-05-31 14:29:00 +02:00
2012-05-25 21:08:35 +02:00
$x264Format = new Video\X264();
$x264Format->setDimensions(320, 240)
->setFrameRate(15)
->setGopSize(25);
$oggFormat = new Video\Ogg();
$oggFormat->setDimensions(320, 240)
->setFrameRate(15)
->setGopSize(25);
$ffmpeg->open('Video.mpeg')
->encode($webMFormat, 'file.webm')
->encode($x264Format, 'file.mp4')
->encode($oggFormat, 'file.ogv')
->close();
2012-05-30 18:43:38 +02:00
.. note:: All formats provided by PHP-FFMpeg extends DefaultVideo, have a look
at the API doc for more information on its behavior.
2012-05-30 15:07:31 +02:00
.. note:: Use PHP-MP4Box to make it compatible with pseudo stream !
2012-05-25 21:08:35 +02:00
Create your own media type
2012-05-30 18:43:38 +02:00
++++++++++++++++++++++++++
2012-05-25 21:08:35 +02:00
2012-05-30 18:43:38 +02:00
PHP-FFMpeg provides ``FFMpeg\Format\Video``, as base interface for creating a
Video format. To define a target format, all you need to do is implement this
Interface.
2012-05-30 15:07:31 +02:00
.. code-block:: php
<?php
namespace Foo\Bar;
use FFMpeg\Format\Video;
class MyFormat implements Video
{
public function getKiloBitrate()
{
return 1500;
}
public function getExtraParams()
{
return '';
}
}
$format = new MyFormat();
$ffmpeg->open('Video.mpeg')
->encode($format, 'file.mp4')
->close();
PHP-FFmpeg brings more interfaces for your video formats :
2012-05-31 14:29:00 +02:00
2012-05-30 15:07:31 +02:00
- ``FFMpeg\Format\Video\Resamplable``
- ``FFMpeg\Format\Video\Resizable``
- ``FFMpeg\Format\Video\Transcodable``
- ``FFMpeg\Format\Video\Interactive``
.. note:: You can combine these features in one video format.
Advanced media type
2012-05-30 18:43:38 +02:00
+++++++++++++++++++
2012-05-30 15:07:31 +02:00
2012-05-31 14:29:00 +02:00
This section presents usage for the different interfaces. You can combine
them for your own formats.
2012-05-30 15:07:31 +02:00
Resizable
2012-05-30 18:43:38 +02:00
.........
2012-05-30 15:07:31 +02:00
2012-05-31 14:29:00 +02:00
This interface provide an easy way to resize a video.
2012-05-30 15:07:31 +02:00
The example below resizes a video by half.
.. code-block:: php
<?php
namespace Foo\Bar;
use FFMpeg\Format\Dimension;
use FFMpeg\Format\Video\Resizable;
class MyFormat implements Resizable
{
public function getComputedDimensions($originalWidth, $originalHeight)
{
return new Dimension(round($originalWidth / 2), round($originalHeight / 2));
}
}
$format = new MyFormat();
$ffmpeg->open('Video.mpeg')
->encode($format, 'file.mp4')
->close();
Resamplable
2012-05-30 18:43:38 +02:00
...........
2012-05-30 15:07:31 +02:00
2012-05-31 14:29:00 +02:00
This interface provides video resampling. The example below resample the video
at 15 frame per second with a I-frame every 30 image (see
`GOP on wikipedia <https://wikipedia.org/wiki/Group_of_pictures>`_).
2012-05-30 15:07:31 +02:00
.. code-block:: php
<?php
namespace Foo\Bar;
use FFMpeg\Format\Video\Resamplable;
class MyFormat implements Resamplable
{
public function getFrameRate()
{
return 15;
}
public function getGOPSize()
{
return 30;
}
}
$format = new MyFormat();
$ffmpeg->open('Video.mpeg')
->encode($format, 'file.mp4')
->close();
Interactive
2012-05-30 18:43:38 +02:00
...........
2012-05-30 15:07:31 +02:00
2012-05-31 14:29:00 +02:00
This interface provides a method to list available codecs for the format.
The example below provides a format object listing available video-codecs for
video supported in flash player.
2012-05-30 15:07:31 +02:00
.. code-block:: php
<?php
namespace Foo\Bar;
use FFMpeg\Format\Video\Interactive;
class MyFormat implements Interactive
{
public function getVideoCodec()
{
return 'libx264';
}
public function getAvailableVideoCodecs()
{
return array('libx264', 'flv');
}
}
$format = new MyFormat();
$ffmpeg->open('Video.mpeg')
->encode($format, 'file.mp4')
->close();
2012-05-31 14:29:00 +02:00
.. _audio-reference:
2012-05-30 15:07:31 +02:00
2012-05-30 18:43:38 +02:00
Audio
^^^^^
This section describes audio processing and Interfaces for building video
2012-05-31 14:29:00 +02:00
formats. As Video is an extension of audio, all these features can be combined
with video features (see :ref:`dedicated video section<video-reference>`).
2012-05-30 18:43:38 +02:00
Simple transcoding
++++++++++++++++++
2012-05-31 14:29:00 +02:00
To transcode audio file or extract an audio soundtrack from a video, you have to
pass the target format to FFMpeg.
The following example initialize a Mp3 format and transcode the file `tune.wav`
to `tune.mp3` :
.. code-block:: php
<?php
use FFMpeg\Format\Audio\Mp3;
$mp3Format = new Mp3();
$ffmpeg->open('tune.wav')
->encode($mp3Format, 'tune.mp3')
->close();
2012-05-30 18:43:38 +02:00
Extract soundtrack from movie
+++++++++++++++++++++++++++++
2012-05-31 14:29:00 +02:00
The following example initialize a Flac format and extract the audio track from
`Video.mpeg` to a target file `soudtrack.flac` :
.. code-block:: php
<?php
use FFMpeg\Format\Audio\Flac;
$flacFormat = new Flac();
$ffmpeg->open('Video.mpeg')
->encode($flacFormat, 'soundtrack.flac')
->close();
.. note:: You must ensure that FFmpeg support the format you request, otherwise
a FFMpeg\Exception\RuntimeException will be thrown.
2012-05-30 18:43:38 +02:00
Create your own media type
++++++++++++++++++++++++++
2012-05-31 14:29:00 +02:00
PHP-FFMpeg provides ``FFMpeg\Format\Audio``, as base interface for creating an
Audio format. To define a target format, all you need to do is implement this
Interface.
This example transcodes the mp3 track to a 128kb mp3 :
.. code-block:: php
<?php
namespace Foo\Bar;
use FFMpeg\Format\Audio;
class MyFormat implements Audio
{
public function getKiloBitrate()
{
return 128;
}
public function getExtraParams()
{
return '';
}
}
$format = new MyFormat();
$ffmpeg->open('song.mp3')
->encode($format, 'song-128.mp3')
->close();
PHP-FFmpeg brings more interfaces for your audio formats :
- ``FFMpeg\Format\Audio\Resamplable``
- ``FFMpeg\Format\Audio\Transcodable``
- ``FFMpeg\Format\Audio\Interactive``
.. note:: You can combine these features in one video format.
2012-05-30 18:43:38 +02:00
Advanced media type
+++++++++++++++++++
2012-05-31 14:29:00 +02:00
This section presents usage for the different audio interfaces. You can combine
them for your own formats.
2012-05-30 18:43:38 +02:00
Resamplable
...........
2012-05-31 14:29:00 +02:00
This interface provides video resampling. The example below resample the video
at 15 frame per second with a I-frame every 30 image (see
`GOP on wikipedia <https://wikipedia.org/wiki/Group_of_pictures>`_).
.. code-block:: php
<?php
namespace Foo\Bar;
use FFMpeg\Format\Audio\Resamplable;
class MyFormat implements Resamplable
{
public function getAudioSampleRate();
{
return 44100;
}
}
$format = new MyFormat();
$ffmpeg->open('song.mp3')
->encode($format, 'song-44100.mp3')
->close();
2012-05-30 18:43:38 +02:00
Interactive
...........
2012-05-31 14:29:00 +02:00
This interface provides a method to list available codecs for the format.
The example below provides a format object listing available audio-codecs for
a portable player.
.. code-block:: php
<?php
namespace Foo\Bar;
use FFMpeg\Format\Audio\Interactive;
class MyFormat implements Interactive
{
public function getAudioCodec()
{
return 'libvorbis';
}
public function getAvailableVideoCodecs()
{
return array('libvorbis', 'libmp3lame', 'libflac');
}
}
2012-05-30 18:43:38 +02:00
Custom commandline options
^^^^^^^^^^^^^^^^^^^^^^^^^^
If you need to add custom FFmpeg command line option, use the
2012-05-30 15:07:31 +02:00
``FFMpeg\Format\Audio::getExtraParams`` method.
2012-05-30 18:43:38 +02:00
As ``Video`` extends ``Audio``, it is also available in any format.
2012-05-30 15:07:31 +02:00
2012-05-30 18:43:38 +02:00
The following example shows a ``getExtraParams`` usage for aac encoding. With the
latest AvConv / FFMPeg version, aac encoding has to be executed with extra command parameters
``-strict experimental``.
2012-05-30 15:07:31 +02:00
.. code-block:: php
<?php
namespace Foo\Bar;
use FFMpeg\Format\Audio\Transcodable;
use FFMpeg\Format\Video;
class MyFormat implements Video, Transcodable
{
2012-05-28 14:29:20 +02:00
2012-05-30 15:07:31 +02:00
public function getAudioCodec()
{
return 'aac';
}
public function getKiloBitrate()
{
return 128;
}
public function getExtraParams()
{
return '-strict experimental';
}
}
$format = new MyFormat();
$ffmpeg->open('Video.mp4')
->encode($format, 'output-aac.mp4')
->close();
2012-05-25 18:25:13 +02:00
FFProbe recipes
---------------