| 
									
										
										
										
											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-25 21:08:35 +02:00
										 |  |  | In the examples  we will show you, we assume we work in an environnment where
 | 
					
						
							|  |  |  | FFMpeg has been initialized to ``$ffmpeg`` var ; there are two ways to
 | 
					
						
							| 
									
										
										
										
											2012-05-30 15:07:31 +02:00
										 |  |  | initialize the environment.
 | 
					
						
							| 
									
										
										
										
											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 
 | 
					
						
							|  |  |  | on your system, ``avconv`` will be loaded in priority. Please read the dedicated 
 | 
					
						
							|  |  |  | chapter below if you want to load ``FFMpeg``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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-28 14:29:20 +02:00
										 |  |  | .. note:: FFMpeg and FFProbe both requires a logger with gives 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
										 |  |  | 
 | 
					
						
							|  |  |  | Defining formats
 | 
					
						
							|  |  |  | ----------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-30 15:07:31 +02:00
										 |  |  | Two base format interface are given by PHP-FFMpeg : ``FFMpeg\Format\Audio`` and
 | 
					
						
							|  |  |  | ``FFMpeg\Format\Video``. ``Video`` is an extension of ``Audio``.
 | 
					
						
							|  |  |  | By implementing one of these interface, you're ready to encode a video.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | But you format can implement more than these interfaces ; PHP-FFMpeg provides a 
 | 
					
						
							|  |  |  | set of interfaces to transcode, resize and resample audio / video.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PHP-FFMpeg also provides a set of default audio and video usefull formats for
 | 
					
						
							|  |  |  | web usages.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-25 21:08:35 +02:00
										 |  |  | Encode a video
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To encode a video, you have to define the target format. A format is an object
 | 
					
						
							|  |  |  | that implements ``FFMpeg\Format\Video``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 15:07:31 +02:00
										 |  |  | Encode for HTML5
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2012-05-25 18:25:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-25 21:08:35 +02:00
										 |  |  | PHP-FFMpeg provides three video format out of the box : HTML5 video formats.
 | 
					
						
							|  |  |  | These formats are available as these objects :
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  - ``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);
 | 
					
						
							|  |  |  |     $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 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 15:07:31 +02:00
										 |  |  | It is very easy to define the media type you want as target. All you need to 
 | 
					
						
							|  |  |  | do is implement the ``FFMpeg\Format\Video`` interface
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. 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 : 
 | 
					
						
							|  |  |  |  - ``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
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This section present basic usage of the different interfaces. You can combine 
 | 
					
						
							|  |  |  | them in your own format.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Resizable
 | 
					
						
							|  |  |  | +++++++++
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This interface provide an easy way to resize a video
 | 
					
						
							|  |  |  | 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
 | 
					
						
							|  |  |  | +++++++++++
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This interface provide an easy way to resample a video
 | 
					
						
							|  |  |  | The example below resample the video at 15 frame per second with a keyframe 
 | 
					
						
							|  |  |  | every 30 image.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. 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
 | 
					
						
							|  |  |  | +++++++++++
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This interface provide a method to list available codec for the format
 | 
					
						
							|  |  |  | The example below provide a format object listing available videocodec for
 | 
					
						
							|  |  |  | flash video.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. 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();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Adding custom commandline options
 | 
					
						
							|  |  |  | +++++++++++++++++++++++++++++++++
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If you need to add custom FFmpeg command line option, you can use the 
 | 
					
						
							|  |  |  | ``FFMpeg\Format\Audio::getExtraParams`` method.
 | 
					
						
							|  |  |  | As Video extends Audio, it is also available in any format.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The following example shows a getExtraParams usage for aac encoding. With the
 | 
					
						
							|  |  |  | latest FFMPeg version, aac encoding can be executed with command parameters
 | 
					
						
							|  |  |  | ``-strict experimental``. Here is what happens if you do not add this extra
 | 
					
						
							|  |  |  | parameter : 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. 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 21:08:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-25 18:25:13 +02:00
										 |  |  | FFProbe recipes
 | 
					
						
							|  |  |  | ---------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |