Minor improvements of the ComplexMedia
This commit is contained in:
parent
71766fed47
commit
4469847d46
4 changed files with 75 additions and 36 deletions
|
|
@ -14,11 +14,12 @@ use FFMpeg\Filters\FiltersCollection;
|
|||
use FFMpeg\Format\AudioInterface;
|
||||
use FFMpeg\Format\FormatInterface;
|
||||
use FFMpeg\Format\ProgressableInterface;
|
||||
use FFMpeg\Format\ProgressListener\AbstractProgressListener;
|
||||
use FFMpeg\Format\VideoInterface;
|
||||
|
||||
/**
|
||||
* Complex media may have multiple inputs and multiple outputs.
|
||||
* This class accepts only filters for -filter_complex.
|
||||
* This class accepts only filters for -filter_complex option.
|
||||
* But you can set initial and additional parameters of the ffmpeg command.
|
||||
*
|
||||
* @see http://trac.ffmpeg.org/wiki/Creating%20multiple%20outputs
|
||||
|
|
@ -46,7 +47,7 @@ class ComplexMedia extends AbstractMediaType
|
|||
private $mapCommands;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
* @var AbstractProgressListener[]
|
||||
*/
|
||||
private $listeners;
|
||||
|
||||
|
|
@ -88,6 +89,8 @@ class ComplexMedia extends AbstractMediaType
|
|||
}
|
||||
|
||||
/**
|
||||
* Add complex filter.
|
||||
*
|
||||
* @param string $in
|
||||
* @param ComplexCompatibleFilter $filter
|
||||
* @param string $out
|
||||
|
|
@ -117,7 +120,6 @@ class ComplexMedia extends AbstractMediaType
|
|||
|
||||
/**
|
||||
* @return string[]
|
||||
* @return void
|
||||
*/
|
||||
public function getInitialParameters()
|
||||
{
|
||||
|
|
@ -137,7 +139,6 @@ class ComplexMedia extends AbstractMediaType
|
|||
|
||||
/**
|
||||
* @return string[]
|
||||
* @return void
|
||||
*/
|
||||
public function getAdditionalParameters()
|
||||
{
|
||||
|
|
@ -180,18 +181,21 @@ class ComplexMedia extends AbstractMediaType
|
|||
}
|
||||
|
||||
/**
|
||||
* @param string[] $outs Output labels of the -filter_complex part.
|
||||
* @param FormatInterface $format
|
||||
* @param string $outputPathfile
|
||||
* Select the streams for output.
|
||||
*
|
||||
* @param string[] $outs Output labels of the -filter_complex part.
|
||||
* @param FormatInterface $format Format of the output file.
|
||||
* @param string $outputFilename Output filename.
|
||||
* @param bool $forceDisableAudio
|
||||
* @param bool $forceDisableVideo
|
||||
*
|
||||
* @return $this
|
||||
* @see https://ffmpeg.org/ffmpeg.html#Manual-stream-selection
|
||||
*/
|
||||
public function map(
|
||||
array $outs,
|
||||
FormatInterface $format,
|
||||
$outputPathfile,
|
||||
$outputFilename,
|
||||
$forceDisableAudio = false,
|
||||
$forceDisableVideo = false
|
||||
) {
|
||||
|
|
@ -202,12 +206,13 @@ class ComplexMedia extends AbstractMediaType
|
|||
}
|
||||
|
||||
// Apply format params.
|
||||
$commands = array_merge($commands, $this->applyFormatParams($format, $forceDisableAudio, $forceDisableVideo));
|
||||
$commands = array_merge($commands,
|
||||
$this->applyFormatParams($format, $forceDisableAudio, $forceDisableVideo));
|
||||
|
||||
// Set output file.
|
||||
$commands[] = $outputPathfile;
|
||||
$commands[] = $outputFilename;
|
||||
|
||||
// Create listener.
|
||||
// Create a listener.
|
||||
if ($format instanceof ProgressableInterface) {
|
||||
$listener = $format->createProgressListener($this, $this->ffprobe, 1, 1, 0);
|
||||
$this->listeners = array_merge($this->listeners, $listener);
|
||||
|
|
@ -220,7 +225,7 @@ class ComplexMedia extends AbstractMediaType
|
|||
/**
|
||||
* Apply added filters and execute ffmpeg command.
|
||||
*
|
||||
* @return ComplexMedia
|
||||
* @return void
|
||||
* @throws RuntimeException
|
||||
*/
|
||||
public function save()
|
||||
|
|
@ -233,8 +238,6 @@ class ComplexMedia extends AbstractMediaType
|
|||
} catch (ExecutionFailureException $e) {
|
||||
throw new RuntimeException('Encoding failed', $e->getCode(), $e);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -256,7 +259,7 @@ class ComplexMedia extends AbstractMediaType
|
|||
$commands[] = '-vcodec';
|
||||
$commands[] = $format->getVideoCodec();
|
||||
}
|
||||
// If the user passed some additional parameters.
|
||||
// If the user passed some additional format parameters.
|
||||
if ($format->getAdditionalParameters() !== null) {
|
||||
$commands = array_merge($commands, $format->getAdditionalParameters());
|
||||
}
|
||||
|
|
@ -348,13 +351,9 @@ class ComplexMedia extends AbstractMediaType
|
|||
*/
|
||||
protected function buildCommand()
|
||||
{
|
||||
$commands = array('-y');
|
||||
if ($this->driver->getConfiguration()->has('ffmpeg.threads')) {
|
||||
$commands[] = '-threads';
|
||||
$commands[] = $this->driver->getConfiguration()->get('ffmpeg.threads');
|
||||
}
|
||||
|
||||
return array_merge($commands,
|
||||
$globalOptions = array('threads', 'filter_threads', 'filter_complex_threads');
|
||||
return array_merge(array('-y'),
|
||||
$this->buildConfiguredGlobalOptions($globalOptions),
|
||||
$this->getInitialParameters(),
|
||||
$this->buildInputsPart($this->inputs),
|
||||
$this->buildComplexFilterPart($this->filters),
|
||||
|
|
@ -363,6 +362,26 @@ class ComplexMedia extends AbstractMediaType
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string[] $optionNames
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function buildConfiguredGlobalOptions($optionNames)
|
||||
{
|
||||
$commands = array();
|
||||
foreach ($optionNames as $optionName) {
|
||||
if (!$this->driver->getConfiguration()->has('ffmpeg.' . $optionName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$commands[] = '-' . $optionName;
|
||||
$commands[] = $this->driver->getConfiguration()->get('ffmpeg.' . $optionName);
|
||||
}
|
||||
|
||||
return $commands;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build inputs part of the ffmpeg command.
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue