2013-06-25 10:03:20 +02:00
|
|
|
<?php
|
|
|
|
|
|
2016-03-06 23:38:04 +01:00
|
|
|
namespace Tests\FFMpeg\Functional;
|
2013-06-25 10:03:20 +02:00
|
|
|
|
2013-11-29 13:25:49 +01:00
|
|
|
use FFMpeg\Coordinate\Dimension;
|
|
|
|
|
use FFMpeg\Filters\Video\ResizeFilter;
|
|
|
|
|
use FFMpeg\Filters\Video\RotateFilter;
|
2013-06-25 10:03:20 +02:00
|
|
|
use FFMpeg\Format\Video\X264;
|
2013-11-29 11:14:49 +01:00
|
|
|
use FFMpeg\Media\Video;
|
2013-06-25 10:03:20 +02:00
|
|
|
|
|
|
|
|
class VideoTranscodeTest extends FunctionalTestCase
|
2013-12-17 17:39:24 +01:00
|
|
|
{
|
2013-06-25 10:03:20 +02:00
|
|
|
public function testSimpleTranscodeX264()
|
|
|
|
|
{
|
2022-02-09 14:32:43 +01:00
|
|
|
$filename = __DIR__.'/output/output-x264.mp4';
|
2013-06-25 10:03:20 +02:00
|
|
|
if (is_file($filename)) {
|
2022-02-09 14:32:43 +01:00
|
|
|
unlink(__DIR__.'/output/output-x264.mp4');
|
2013-06-25 10:03:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ffmpeg = $this->getFFMpeg();
|
2022-02-09 14:32:43 +01:00
|
|
|
$video = $ffmpeg->open(__DIR__.'/../files/Test.ogv');
|
2013-06-25 10:03:20 +02:00
|
|
|
|
|
|
|
|
$this->assertInstanceOf('FFMpeg\Media\Video', $video);
|
|
|
|
|
|
|
|
|
|
$lastPercentage = null;
|
|
|
|
|
$phpunit = $this;
|
|
|
|
|
|
2016-12-02 16:34:37 +01:00
|
|
|
$codec = new X264('aac');
|
|
|
|
|
$codec->on('progress', function ($video, $codec, $percentage) use ($phpunit, &$lastPercentage) {
|
|
|
|
|
if (null !== $lastPercentage) {
|
|
|
|
|
$phpunit->assertGreaterThanOrEqual($lastPercentage, $percentage);
|
|
|
|
|
}
|
|
|
|
|
$lastPercentage = $percentage;
|
|
|
|
|
$phpunit->assertGreaterThanOrEqual(0, $percentage);
|
|
|
|
|
$phpunit->assertLessThanOrEqual(100, $percentage);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$video->save($codec, $filename);
|
|
|
|
|
$this->assertFileExists($filename);
|
|
|
|
|
unlink($filename);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testAacTranscodeX264()
|
|
|
|
|
{
|
2022-02-09 14:32:43 +01:00
|
|
|
$filename = __DIR__.'/output/output-x264_2.mp4';
|
2016-12-02 16:34:37 +01:00
|
|
|
if (is_file($filename)) {
|
2022-02-09 14:32:43 +01:00
|
|
|
unlink(__DIR__.'/output/output-x264_2.mp4');
|
2016-12-02 16:34:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ffmpeg = $this->getFFMpeg();
|
2022-02-09 14:32:43 +01:00
|
|
|
$video = $ffmpeg->open(__DIR__.'/../files/sample.3gp');
|
2016-12-02 16:34:37 +01:00
|
|
|
|
|
|
|
|
$this->assertInstanceOf('FFMpeg\Media\Video', $video);
|
|
|
|
|
|
|
|
|
|
$lastPercentage = null;
|
|
|
|
|
$phpunit = $this;
|
|
|
|
|
|
|
|
|
|
$codec = new X264('aac');
|
2013-06-25 10:03:20 +02:00
|
|
|
$codec->on('progress', function ($video, $codec, $percentage) use ($phpunit, &$lastPercentage) {
|
|
|
|
|
if (null !== $lastPercentage) {
|
|
|
|
|
$phpunit->assertGreaterThanOrEqual($lastPercentage, $percentage);
|
|
|
|
|
}
|
|
|
|
|
$lastPercentage = $percentage;
|
|
|
|
|
$phpunit->assertGreaterThanOrEqual(0, $percentage);
|
|
|
|
|
$phpunit->assertLessThanOrEqual(100, $percentage);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$video->save($codec, $filename);
|
|
|
|
|
$this->assertFileExists($filename);
|
|
|
|
|
unlink($filename);
|
|
|
|
|
}
|
2013-11-29 11:14:49 +01:00
|
|
|
|
|
|
|
|
public function testTranscodeInvalidFile()
|
|
|
|
|
{
|
2020-02-13 00:39:31 +01:00
|
|
|
$this->expectException('\FFMpeg\Exception\RuntimeException');
|
2013-11-29 11:14:49 +01:00
|
|
|
$ffmpeg = $this->getFFMpeg();
|
2022-02-09 14:32:43 +01:00
|
|
|
$ffmpeg->open(__DIR__.'/../files/UnknownFileTest.ogv');
|
2013-11-29 11:14:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testSaveInvalidForgedVideo()
|
|
|
|
|
{
|
|
|
|
|
$ffmpeg = $this->getFFMpeg();
|
2022-02-09 14:32:43 +01:00
|
|
|
$video = new Video(__DIR__.'/../files/UnknownFileTest.ogv', $ffmpeg->getFFMpegDriver(), $ffmpeg->getFFProbe());
|
2013-11-29 11:14:49 +01:00
|
|
|
|
2020-02-13 00:39:31 +01:00
|
|
|
$this->expectException('\FFMpeg\Exception\RuntimeException');
|
2022-02-09 14:32:43 +01:00
|
|
|
$video->save(new X264('aac'), __DIR__.'/output/output-x264.mp4');
|
2013-11-29 11:14:49 +01:00
|
|
|
}
|
2013-11-29 13:25:49 +01:00
|
|
|
|
|
|
|
|
public function testTranscodePortraitVideo()
|
|
|
|
|
{
|
2013-12-02 12:47:27 +01:00
|
|
|
$info = $this->getNameAndVersion();
|
|
|
|
|
|
2022-02-09 14:32:43 +01:00
|
|
|
if ('avconv' === $info['name'] && version_compare($info['version'], '0.9', '<')) {
|
2013-12-02 12:47:27 +01:00
|
|
|
$this->markTestSkipped('This version of avconv is buggy and does not support this test.');
|
|
|
|
|
}
|
2013-12-17 17:39:24 +01:00
|
|
|
|
2022-02-09 14:32:43 +01:00
|
|
|
$filename = __DIR__.'/output/output-x264.mp4';
|
2013-11-29 13:25:49 +01:00
|
|
|
if (is_file($filename)) {
|
2022-02-09 14:32:43 +01:00
|
|
|
unlink(__DIR__.'/output/output-x264.mp4');
|
2013-11-29 13:25:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ffmpeg = $this->getFFMpeg();
|
2022-02-09 14:32:43 +01:00
|
|
|
$video = $ffmpeg->open(__DIR__.'/../files/portrait.MOV');
|
2013-11-29 13:25:49 +01:00
|
|
|
|
|
|
|
|
$video->filters()
|
|
|
|
|
->resize(new Dimension(320, 240), ResizeFilter::RESIZEMODE_INSET)
|
|
|
|
|
->rotate(RotateFilter::ROTATE_90);
|
2016-12-02 16:34:37 +01:00
|
|
|
$video->save(new X264('aac'), $filename);
|
2013-11-29 13:25:49 +01:00
|
|
|
|
|
|
|
|
$dimension = $ffmpeg->getFFProbe()
|
|
|
|
|
->streams($filename)
|
|
|
|
|
->videos()
|
|
|
|
|
->first()
|
|
|
|
|
->getDimensions();
|
|
|
|
|
|
|
|
|
|
$this->assertLessThan(1, $dimension->getRatio(false)->getValue());
|
|
|
|
|
$this->assertEquals(240, $dimension->getHeight());
|
|
|
|
|
|
|
|
|
|
$this->assertFileExists($filename);
|
|
|
|
|
unlink($filename);
|
|
|
|
|
}
|
2013-12-17 17:39:24 +01:00
|
|
|
|
2013-12-02 12:47:27 +01:00
|
|
|
private function getNameAndVersion()
|
|
|
|
|
{
|
|
|
|
|
$binary = $this
|
|
|
|
|
->getFFMpeg()
|
|
|
|
|
->getFFMpegDriver()
|
|
|
|
|
->getProcessBuilderFactory()
|
|
|
|
|
->getBinary();
|
2013-12-17 17:39:24 +01:00
|
|
|
|
2013-12-02 12:47:27 +01:00
|
|
|
$output = $matches = null;
|
2022-02-09 14:32:43 +01:00
|
|
|
exec($binary.' -version 2>&1', $output);
|
2013-12-02 12:47:27 +01:00
|
|
|
|
|
|
|
|
if (!isset($output[0])) {
|
2022-02-09 14:32:43 +01:00
|
|
|
return ['name' => null, 'version' => null];
|
2013-12-02 12:47:27 +01:00
|
|
|
}
|
2013-12-17 17:39:24 +01:00
|
|
|
|
2013-12-02 12:47:27 +01:00
|
|
|
preg_match('/^([a-z]+)\s+version\s+([0-9\.]+)/i', $output[0], $matches);
|
|
|
|
|
|
|
|
|
|
if (count($matches) > 0) {
|
2022-02-09 14:32:43 +01:00
|
|
|
return ['name' => $matches[1], 'version' => $matches[2]];
|
2013-12-02 12:47:27 +01:00
|
|
|
}
|
2013-12-17 17:39:24 +01:00
|
|
|
|
2022-02-09 14:32:43 +01:00
|
|
|
return ['name' => null, 'version' => null];
|
2013-12-02 12:47:27 +01:00
|
|
|
}
|
2013-06-25 10:03:20 +02:00
|
|
|
}
|