Merge branch 'master' into addAudioMetadata
This commit is contained in:
commit
31629f7162
6 changed files with 155 additions and 1 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -4,3 +4,4 @@
|
|||
composer.phar
|
||||
composer.lock
|
||||
phpunit.xml
|
||||
sami.phar
|
||||
|
|
|
|||
16
README.md
16
README.md
|
|
@ -223,6 +223,22 @@ The resize filter takes three parameters :
|
|||
- `$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.
|
||||
|
|
|
|||
|
|
@ -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": {
|
||||
|
|
|
|||
60
src/FFMpeg/Filters/Video/PadFilter.php
Normal file
60
src/FFMpeg/Filters/Video/PadFilter.php
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of PHP-FFmpeg.
|
||||
*
|
||||
* (c) Strime <contact@strime.io>
|
||||
*
|
||||
* 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[] = '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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
|
|
@ -132,4 +146,18 @@ class VideoFilters extends AudioFilters
|
|||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies a custom filter: -vf foo bar
|
||||
*
|
||||
* @param string $parameters
|
||||
*
|
||||
* @return VideoFilters
|
||||
*/
|
||||
public function custom($parameters)
|
||||
{
|
||||
$this->media->addFilter(new CustomFilter($parameters));
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
44
tests/Unit/Filters/Video/PadFilterTest.php
Normal file
44
tests/Unit/Filters/Video/PadFilterTest.php
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\FFMpeg\Unit\Filters\Video;
|
||||
|
||||
use FFMpeg\Filters\Video\PadFilter;
|
||||
use Tests\FFMpeg\Unit\TestCase;
|
||||
use FFMpeg\FFProbe\DataMapping\Stream;
|
||||
use FFMpeg\FFProbe\DataMapping\StreamCollection;
|
||||
use FFMpeg\Coordinate\Dimension;
|
||||
|
||||
class PadFilterTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider provideDimensions
|
||||
*/
|
||||
public function testApply(Dimension $dimension, $width, $height, $expected)
|
||||
{
|
||||
$video = $this->getVideoMock();
|
||||
$pathfile = '/path/to/file'.mt_rand();
|
||||
|
||||
$format = $this->getMock('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')),
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue