From 345656b1dc55f0ec61d53835262dd50ec74ab827 Mon Sep 17 00:00:00 2001 From: Romain Biard Date: Tue, 20 Dec 2016 18:25:45 -0300 Subject: [PATCH 1/8] Creation of a pad filters which adds padding (black bars) to a video --- src/FFMpeg/Filters/Video/PadFilter.php | 60 +++++++++++++++++++++++ src/FFMpeg/Filters/Video/VideoFilters.php | 14 ++++++ 2 files changed, 74 insertions(+) create mode 100644 src/FFMpeg/Filters/Video/PadFilter.php diff --git a/src/FFMpeg/Filters/Video/PadFilter.php b/src/FFMpeg/Filters/Video/PadFilter.php new file mode 100644 index 0000000..551604c --- /dev/null +++ b/src/FFMpeg/Filters/Video/PadFilter.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Coordinate\Dimension; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Media\Video; +use FFMpeg\Format\VideoInterface; + +class PadFilter implements VideoFilterInterface +{ + /** @var Dimension */ + private $dimension; + /** @var integer */ + private $priority; + + public function __construct(Dimension $dimension, $priority = 0) + { + $this->dimension = $dimension; + $this->priority = $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * @return Dimension + */ + public function getDimension() + { + return $this->dimension; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + $commands = array(); + + $commands[] = '-vf'; + $commands[] = 'pad=' . $this->dimension->getWidth() . ':' . $this->dimension->getHeight() . ':(' . $this->dimension->getWidth() . '-iw)/2:(' . $this->dimension->getHeight() .'-ih)/2'; + + return $commands; + } +} diff --git a/src/FFMpeg/Filters/Video/VideoFilters.php b/src/FFMpeg/Filters/Video/VideoFilters.php index 00a99d9..a5caa32 100644 --- a/src/FFMpeg/Filters/Video/VideoFilters.php +++ b/src/FFMpeg/Filters/Video/VideoFilters.php @@ -98,6 +98,20 @@ class VideoFilters extends AudioFilters return $this; } + /** + * Adds padding (black bars) to a video. + * + * @param Dimension $dimension + * + * @return VideoFilters + */ + public function pad(Dimension $dimension) + { + $this->media->addFilter(new PadFilter($dimension)); + + return $this; + } + public function rotate($angle) { $this->media->addFilter(new RotateFilter($angle, 30)); From 7c4eed68f9eea91537efa06bf50665c286b1bf09 Mon Sep 17 00:00:00 2001 From: Romain Biard Date: Tue, 20 Dec 2016 18:47:40 -0300 Subject: [PATCH 2/8] We change the way we execute this filter. --- src/FFMpeg/Filters/Video/PadFilter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FFMpeg/Filters/Video/PadFilter.php b/src/FFMpeg/Filters/Video/PadFilter.php index 551604c..df19a2d 100644 --- a/src/FFMpeg/Filters/Video/PadFilter.php +++ b/src/FFMpeg/Filters/Video/PadFilter.php @@ -53,7 +53,7 @@ class PadFilter implements VideoFilterInterface $commands = array(); $commands[] = '-vf'; - $commands[] = 'pad=' . $this->dimension->getWidth() . ':' . $this->dimension->getHeight() . ':(' . $this->dimension->getWidth() . '-iw)/2:(' . $this->dimension->getHeight() .'-ih)/2'; + $commands[] = 'scale=iw*min(' . $this->dimension->getWidth() . '/iw\,' . $this->dimension->getHeight() .'/ih):ih*min(' . $this->dimension->getWidth() . '/iw\,' . $this->dimension->getHeight() .'/ih),pad=' . $this->dimension->getWidth() . ':' . $this->dimension->getHeight() . ':(' . $this->dimension->getWidth() . '-iw)/2:(' . $this->dimension->getHeight() .'-ih)/2'; return $commands; } From bbe94784c2d7388e4c29a753ac6af1587c8b55ca Mon Sep 17 00:00:00 2001 From: Romain Biard Date: Wed, 21 Dec 2016 10:26:51 -0300 Subject: [PATCH 3/8] Addition of the tests --- composer.json | 5 +++ tests/Unit/Filters/Video/PadFilterTest.php | 44 ++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 tests/Unit/Filters/Video/PadFilterTest.php diff --git a/composer.json b/composer.json index 7e2babf..c7a79b4 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,11 @@ "name": "Patrik Karisch", "email": "patrik@karisch.guru", "homepage": "http://www.karisch.guru" + }, + { + "name": "Romain Biard", + "email": "romain.biard@gmail.com", + "homepage": "https://www.strime.io/" } ], "require": { diff --git a/tests/Unit/Filters/Video/PadFilterTest.php b/tests/Unit/Filters/Video/PadFilterTest.php new file mode 100644 index 0000000..0fc48e6 --- /dev/null +++ b/tests/Unit/Filters/Video/PadFilterTest.php @@ -0,0 +1,44 @@ +getVideoMock(); + $pathfile = '/path/to/file'.mt_rand(); + + $format = $this->createMock('FFMpeg\Format\VideoInterface'); + + $streams = new StreamCollection(array( + new Stream(array( + 'codec_type' => 'video', + 'width' => $width, + 'height' => $height, + )) + )); + + $filter = new PadFilter($dimension); + $this->assertEquals($expected, $filter->apply($video, $format)); + } + + public function provideDimensions() + { + return array( + array(new Dimension(1000, 800), 640, 480, array('-vf', 'scale=iw*min(1000/iw\,800/ih):ih*min(1000/iw\,800/ih),pad=1000:800:(1000-iw)/2:(800-ih)/2')), + array(new Dimension(300, 600), 640, 480, array('-vf', 'scale=iw*min(300/iw\,600/ih):ih*min(300/iw\,600/ih),pad=300:600:(300-iw)/2:(600-ih)/2')), + array(new Dimension(100, 900), 640, 480, array('-vf', 'scale=iw*min(100/iw\,900/ih):ih*min(100/iw\,900/ih),pad=100:900:(100-iw)/2:(900-ih)/2')), + array(new Dimension(1200, 200), 640, 480, array('-vf', 'scale=iw*min(1200/iw\,200/ih):ih*min(1200/iw\,200/ih),pad=1200:200:(1200-iw)/2:(200-ih)/2')), + ); + } +} From 52d32ec70b9671558fd600c8264e7398683a024a Mon Sep 17 00:00:00 2001 From: Romain Biard Date: Wed, 21 Dec 2016 10:30:52 -0300 Subject: [PATCH 4/8] Update of the README --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f7cc1f..94196dc 100644 --- a/README.md +++ b/README.md @@ -221,12 +221,28 @@ Resizes a video to a given size. $video->filters()->resize($dimension, $mode, $useStandards); ``` -The resize filter takes three parameters : +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. +If you want a video in a non-standard ratio, you can use the padding filter to resize your video in the desired size, and wrap it into black bars. + +```php +$video->filters()->pad($dimension); +``` + +The pad filter takes one parameter: + +- `$dimension`, an instance of `FFMpeg\Coordinate\Dimension` + +Don't forget to save it afterwards. + +```php +$video->save(new FFMpeg\Format\Video\X264(), $new_file); +``` + ###### Watermark Watermark a video with a given image. From ad2adb61d1473bfa40c3dd6df2b3153fca11918f Mon Sep 17 00:00:00 2001 From: Romain Biard Date: Wed, 21 Dec 2016 12:42:42 -0300 Subject: [PATCH 5/8] We exclude sami.phar of the git tracking --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c85f162..2b7fb77 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ composer.phar composer.lock phpunit.xml +sami.phar From ac3e8f16ca47b8864dcb79033c2fc6929a029996 Mon Sep 17 00:00:00 2001 From: Romain Biard Date: Wed, 21 Dec 2016 12:43:57 -0300 Subject: [PATCH 6/8] We use getMote instead of createMock --- tests/Unit/Filters/Video/PadFilterTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Unit/Filters/Video/PadFilterTest.php b/tests/Unit/Filters/Video/PadFilterTest.php index 0fc48e6..1d7c85a 100644 --- a/tests/Unit/Filters/Video/PadFilterTest.php +++ b/tests/Unit/Filters/Video/PadFilterTest.php @@ -18,7 +18,7 @@ class PadFilterTest extends TestCase $video = $this->getVideoMock(); $pathfile = '/path/to/file'.mt_rand(); - $format = $this->createMock('FFMpeg\Format\VideoInterface'); + $format = $this->getMock('FFMpeg\Format\VideoInterface'); $streams = new StreamCollection(array( new Stream(array( From af38e5b0acb6e2c87ec013175c0cc968d2a0749f Mon Sep 17 00:00:00 2001 From: Romain Biard Date: Wed, 28 Dec 2016 16:42:03 -0300 Subject: [PATCH 7/8] Creation of a method to apply custom filters --- src/FFMpeg/Filters/Video/VideoFilters.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/FFMpeg/Filters/Video/VideoFilters.php b/src/FFMpeg/Filters/Video/VideoFilters.php index 00a99d9..4978e80 100644 --- a/src/FFMpeg/Filters/Video/VideoFilters.php +++ b/src/FFMpeg/Filters/Video/VideoFilters.php @@ -132,4 +132,18 @@ class VideoFilters extends AudioFilters return $this; } + + /** + * Resizes a video to a given dimension. + * + * @param string $parameters + * + * @return VideoFilters + */ + public function custom($parameters) + { + $this->media->addFilter(new CustomFilter($parameters)); + + return $this; + } } From 71bfcbcc1172eba3dbb610155f01b36fe78a8b48 Mon Sep 17 00:00:00 2001 From: Romain Biard Date: Wed, 28 Dec 2016 16:47:22 -0300 Subject: [PATCH 8/8] We change the description of the method --- src/FFMpeg/Filters/Video/VideoFilters.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FFMpeg/Filters/Video/VideoFilters.php b/src/FFMpeg/Filters/Video/VideoFilters.php index 4978e80..af319c6 100644 --- a/src/FFMpeg/Filters/Video/VideoFilters.php +++ b/src/FFMpeg/Filters/Video/VideoFilters.php @@ -134,7 +134,7 @@ class VideoFilters extends AudioFilters } /** - * Resizes a video to a given dimension. + * Applies a custom filter: -vf foo bar * * @param string $parameters *