Merge pull request #484 from igorkosteski/master
Fix Clipping video transcoding progress not correct
This commit is contained in:
commit
c03e114969
7 changed files with 43 additions and 12 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
@ -78,9 +79,21 @@ class Video extends Audio
|
||||||
try {
|
try {
|
||||||
/** add listeners here */
|
/** add listeners here */
|
||||||
$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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue