Merge pull request #484 from igorkosteski/master

Fix Clipping video transcoding progress not correct
This commit is contained in:
Jens Hausdorf 2018-02-20 18:44:55 +01:00 committed by GitHub
commit c03e114969
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 43 additions and 12 deletions

View file

@ -121,7 +121,7 @@ abstract class DefaultAudio extends EventEmitter implements AudioInterface, Prog
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, $pass, $total) public function createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, $pass, $total, $duration = 0)
{ {
$format = $this; $format = $this;
$listener = new AudioProgressListener($ffprobe, $media->getPathfile(), $pass, $total); $listener = new AudioProgressListener($ffprobe, $media->getPathfile(), $pass, $total);

View file

@ -80,12 +80,13 @@ abstract class AbstractProgressListener extends EventEmitter implements Listener
* *
* @throws RuntimeException * @throws RuntimeException
*/ */
public function __construct(FFProbe $ffprobe, $pathfile, $currentPass, $totalPass) public function __construct(FFProbe $ffprobe, $pathfile, $currentPass, $totalPass, $duration = 0)
{ {
$this->ffprobe = $ffprobe; $this->ffprobe = $ffprobe;
$this->pathfile = $pathfile; $this->pathfile = $pathfile;
$this->currentPass = $currentPass; $this->currentPass = $currentPass;
$this->totalPass = $totalPass; $this->totalPass = $totalPass;
$this->duration = $duration;
} }
/** /**
@ -254,9 +255,8 @@ abstract class AbstractProgressListener extends EventEmitter implements Listener
return; return;
} }
$this->totalSize = $format->get('size') / 1024; $this->duration = (int) $this->duration > 0 ? $this->duration : $format->get('duration');
$this->duration = $format->get('duration'); $this->totalSize = $format->get('size') / 1024 * ($this->duration / $format->get('duration'));
$this->initialized = true; $this->initialized = true;
} }
} }

View file

@ -24,8 +24,9 @@ interface ProgressableInterface extends EventEmitterInterface
* @param FFProbe $ffprobe * @param FFProbe $ffprobe
* @param Integer $pass The current pas snumber * @param Integer $pass The current pas snumber
* @param Integer $total The total pass number * @param Integer $total The total pass number
* @param Integer $duration The new video duration
* *
* @return array An array of listeners * @return array An array of listeners
*/ */
public function createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, $pass, $total); public function createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, $pass, $total, $duration = 0);
} }

View file

@ -125,7 +125,7 @@ abstract class DefaultVideo extends DefaultAudio implements VideoInterface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, $pass, $total) public function createProgressListener(MediaTypeInterface $media, FFProbe $ffprobe, $pass, $total, $duration = 0)
{ {
$format = $this; $format = $this;
$listeners = array(new VideoProgressListener($ffprobe, $media->getPathfile(), $pass, $total)); $listeners = array(new VideoProgressListener($ffprobe, $media->getPathfile(), $pass, $total));

View file

@ -62,7 +62,7 @@ class Audio extends AbstractStreamableMedia
$listeners = null; $listeners = null;
if ($format instanceof ProgressableInterface) { if ($format instanceof ProgressableInterface) {
$listeners = $format->createProgressListener($this, $this->ffprobe, 1, 1); $listeners = $format->createProgressListener($this, $this->ffprobe, 1, 1, 0);
} }
$commands = $this->buildCommand($format, $outputPathfile); $commands = $this->buildCommand($format, $outputPathfile);

View file

@ -24,6 +24,7 @@ use FFMpeg\Format\ProgressableInterface;
use FFMpeg\Format\AudioInterface; use FFMpeg\Format\AudioInterface;
use FFMpeg\Format\VideoInterface; use FFMpeg\Format\VideoInterface;
use Neutron\TemporaryFilesystem\Manager as FsManager; use Neutron\TemporaryFilesystem\Manager as FsManager;
use FFMpeg\Filters\Video\ClipFilter;
class Video extends Audio class Video extends Audio
{ {
@ -80,7 +81,19 @@ class Video extends Audio
$listeners = null; $listeners = null;
if ($format instanceof ProgressableInterface) { if ($format instanceof ProgressableInterface) {
$listeners = $format->createProgressListener($this, $this->ffprobe, $pass + 1, $totalPasses); $filters = clone $this->filters;
$duration = 0;
// check the filters of the video, and if the video has the ClipFilter then
// take the new video duration and send to the
// FFMpeg\Format\ProgressListener\AbstractProgressListener class
foreach ($filters as $filter) {
if($filter instanceof ClipFilter){
$duration = $filter->getDuration()->toSeconds();
break;
}
}
$listeners = $format->createProgressListener($this, $this->ffprobe, $pass + 1, $totalPasses, $duration);
} }
$this->driver->command($passCommands, false, $listeners); $this->driver->command($passCommands, false, $listeners);

View file

@ -11,7 +11,7 @@ class VideoProgressListenerTest extends TestCase
/** /**
* @dataProvider provideData * @dataProvider provideData
*/ */
public function testHandle($size, $duration, public function testHandle($size, $duration, $newVideoDuration,
$data, $expectedPercent, $expectedRemaining, $expectedRate, $data, $expectedPercent, $expectedRemaining, $expectedRate,
$data2, $expectedPercent2, $expectedRemaining2, $expectedRate2, $data2, $expectedPercent2, $expectedRemaining2, $expectedRate2,
$currentPass, $totalPass $currentPass, $totalPass
@ -26,7 +26,7 @@ class VideoProgressListenerTest extends TestCase
'duration' => $duration, 'duration' => $duration,
)))); ))));
$listener = new VideoProgressListener($ffprobe, __FILE__, $currentPass, $totalPass); $listener = new VideoProgressListener($ffprobe, __FILE__, $currentPass, $totalPass, $newVideoDuration);
$phpunit = $this; $phpunit = $this;
$n = 0; $n = 0;
$listener->on('progress', function ($percent, $remaining, $rate) use (&$n, $phpunit, $expectedPercent, $expectedRemaining, $expectedRate, $expectedPercent2, $expectedRemaining2, $expectedRate2) { $listener->on('progress', function ($percent, $remaining, $rate) use (&$n, $phpunit, $expectedPercent, $expectedRemaining, $expectedRate, $expectedPercent2, $expectedRemaining2, $expectedRate2) {
@ -57,6 +57,7 @@ class VideoProgressListenerTest extends TestCase
array( array(
147073958, 147073958,
281.147533, 281.147533,
281.147533,
'frame= 206 fps=202 q=10.0 size= 571kB time=00:00:07.12 bitrate= 656.8kbits/s dup=9 drop=0', 'frame= 206 fps=202 q=10.0 size= 571kB time=00:00:07.12 bitrate= 656.8kbits/s dup=9 drop=0',
2, 2,
0, 0,
@ -71,6 +72,7 @@ class VideoProgressListenerTest extends TestCase
array( array(
147073958, 147073958,
281.147533, 281.147533,
281.147533,
'frame= 206 fps=202 q=10.0 size= 571kB time=00:00:07.12 bitrate= 656.8kbits/s dup=9 drop=0', 'frame= 206 fps=202 q=10.0 size= 571kB time=00:00:07.12 bitrate= 656.8kbits/s dup=9 drop=0',
1, 1,
0, 0,
@ -81,6 +83,21 @@ class VideoProgressListenerTest extends TestCase
3868, 3868,
1, 1,
2 2
),
array(
147073958,
281.147533,
35,
'frame= 206 fps=202 q=10.0 size= 571kB time=00:00:07.12 bitrate= 656.8kbits/s dup=9 drop=0',
60,
0,
0,
'frame= 854 fps=113 q=20.0 size= 4430kB time=00:00:33.04 bitrate=1098.5kbits/s dup=36 drop=0',
97,
0,
3868,
2,
2
) )
); );
} }