From cb7d850338844d74f425c44c0b883d3b24681255 Mon Sep 17 00:00:00 2001 From: Jens Hausdorf Date: Tue, 27 Jun 2017 23:44:26 +0200 Subject: [PATCH] Audio Params (#344) * :rocket: video profile and level * add missing getter * add missing use statement * add missing return $this * 1 test fixed * fix other tests and clean up We MUST rewrite them. They are too complex when it comes to new features * trim trailing whitespaces * fix typo * :rocket: support for additional params in audio --- src/FFMpeg/Format/Audio/DefaultAudio.php | 25 +++++ src/FFMpeg/Format/AudioInterface.php | 7 ++ src/FFMpeg/Format/Profile.php | 22 +++++ src/FFMpeg/Format/Video/DefaultVideo.php | 78 ++++++++++----- src/FFMpeg/Format/VideoInterface.php | 13 ++- src/FFMpeg/Media/Audio.php | 7 ++ src/FFMpeg/Media/Video.php | 10 +- tests/Unit/Media/VideoTest.php | 119 +++++++++++++---------- 8 files changed, 196 insertions(+), 85 deletions(-) create mode 100644 src/FFMpeg/Format/Profile.php diff --git a/src/FFMpeg/Format/Audio/DefaultAudio.php b/src/FFMpeg/Format/Audio/DefaultAudio.php index 4226bff..d0d1030 100644 --- a/src/FFMpeg/Format/Audio/DefaultAudio.php +++ b/src/FFMpeg/Format/Audio/DefaultAudio.php @@ -46,6 +46,31 @@ abstract class DefaultAudio extends EventEmitter implements AudioInterface, Prog return $this->audioCodec; } + /** + * {@inheritdoc} + */ + public function getAdditionalParameters() + { + return $this->additionalParameters; + } + + /** + * Sets additional parameters. + * + * @param array $additionalParameters + * @throws InvalidArgumentException + */ + public function setAdditionalParameters($additionalParameters) + { + if (!is_array($additionalParameters)) { + throw new InvalidArgumentException('Wrong additionalParamaters value'); + } + + $this->additionalParameters = $additionalParameters; + + return $this; + } + /** * Sets the audio codec, Should be in the available ones, otherwise an * exception is thrown. diff --git a/src/FFMpeg/Format/AudioInterface.php b/src/FFMpeg/Format/AudioInterface.php index 1af29c0..9a8a927 100644 --- a/src/FFMpeg/Format/AudioInterface.php +++ b/src/FFMpeg/Format/AudioInterface.php @@ -25,6 +25,13 @@ interface AudioInterface extends FormatInterface * @return integer */ public function getAudioChannels(); + + /** + * Returns the list of available video codecs for this format. + * + * @return array + */ + public function getAdditionalParameters(); /** * Returns the audio codec. diff --git a/src/FFMpeg/Format/Profile.php b/src/FFMpeg/Format/Profile.php new file mode 100644 index 0000000..32a65a7 --- /dev/null +++ b/src/FFMpeg/Format/Profile.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Format; + +interface Profile { + + const HIGH = 'high'; + + const MAIN = 'main'; + + const BASELINE = 'baseline'; + +} \ No newline at end of file diff --git a/src/FFMpeg/Format/Video/DefaultVideo.php b/src/FFMpeg/Format/Video/DefaultVideo.php index 1abfa67..dc7d898 100644 --- a/src/FFMpeg/Format/Video/DefaultVideo.php +++ b/src/FFMpeg/Format/Video/DefaultVideo.php @@ -16,6 +16,7 @@ use FFMpeg\Exception\InvalidArgumentException; use FFMpeg\Format\Audio\DefaultAudio; use FFMpeg\Format\VideoInterface; use FFMpeg\Media\MediaTypeInterface; +use FFMpeg\Format\Profile; use FFMpeg\Format\ProgressListener\VideoProgressListener; /** @@ -32,8 +33,56 @@ abstract class DefaultVideo extends DefaultAudio implements VideoInterface /** @var Integer */ protected $modulus = 16; - /** @var Array */ - protected $additionalParamaters; + /** @var string */ + private $profile = Profile::MAIN; + + /** @var float */ + private $level = 3.1; + + /** @var string[] */ + protected $additionalParameters; + + /** + * Sets the profile of this video + * @var string $profile must be one of `baseline`, `main` or `high` + * @throws \InvalidArgumentException + */ + public function setProfile(string $profile) { + switch($profile) { + case Profile::BASELINE: + case Profile::MAIN: + case Profile::HIGH: + // these are fine + break; + default: + throw new \InvalidArgumentException('Invalid profile given! Must be one of `baseline`, `main` or `high`!'); + } + $this->profile = $profile; + return $this; + } + + /** + * @inheritDoc + */ + public function getProfile() { + return $this->profile; + } + + /** + * Sets the given level + * @param float $level The level(for example: 3.0, 3.1, 4.0, 4.1) + */ + public function setLevel(float $level) { + $this->level = $level; + return $this; + } + + /** + * @inheritDoc + */ + public function getLevel() { + return $this->level; + } /** * {@inheritdoc} @@ -97,31 +146,6 @@ abstract class DefaultVideo extends DefaultAudio implements VideoInterface return $this->modulus; } - /** - * {@inheritdoc} - */ - public function getAdditionalParameters() - { - return $this->additionalParamaters; - } - - /** - * Sets additional parameters. - * - * @param array $additionalParamaters - * @throws InvalidArgumentException - */ - public function setAdditionalParameters($additionalParamaters) - { - if (!is_array($additionalParamaters)) { - throw new InvalidArgumentException('Wrong additionalParamaters value'); - } - - $this->additionalParamaters = $additionalParamaters; - - return $this; - } - /** * {@inheritdoc} */ diff --git a/src/FFMpeg/Format/VideoInterface.php b/src/FFMpeg/Format/VideoInterface.php index 329bff2..71bb659 100644 --- a/src/FFMpeg/Format/VideoInterface.php +++ b/src/FFMpeg/Format/VideoInterface.php @@ -56,9 +56,14 @@ interface VideoInterface extends AudioInterface public function getAvailableVideoCodecs(); /** - * Returns the list of available video codecs for this format. - * - * @return array + * Returns the current profile + * @return string */ - public function getAdditionalParameters(); + public function getProfile(); + + /** + * Returns the level + * @return float + */ + public function getLevel(); } diff --git a/src/FFMpeg/Media/Audio.php b/src/FFMpeg/Media/Audio.php index 19f3478..4b5c84b 100644 --- a/src/FFMpeg/Media/Audio.php +++ b/src/FFMpeg/Media/Audio.php @@ -91,6 +91,13 @@ class Audio extends AbstractStreamableMedia $commands[] = '-ac'; $commands[] = $format->getAudioChannels(); } + // If the user passed some additional parameters + if (null !== $format->getAdditionalParameters()) { + foreach ($format->getAdditionalParameters() as $additionalParameter) { + $commands[] = $additionalParameter; + } + } + $commands[] = $outputPathfile; try { diff --git a/src/FFMpeg/Media/Video.php b/src/FFMpeg/Media/Video.php index dc7e46e..7005e72 100644 --- a/src/FFMpeg/Media/Video.php +++ b/src/FFMpeg/Media/Video.php @@ -72,6 +72,8 @@ class Video extends Audio if ($format instanceof VideoInterface) { if (null !== $format->getVideoCodec()) { $filters->add(new SimpleFilter(array('-vcodec', $format->getVideoCodec()))); + $filters->add(new SimpleFilter(array('-vprofile', $format->getProfile()))); + $filters->add(new SimpleFilter(array('-level', $format->getLevel()))); } } if ($format instanceof AudioInterface) { @@ -121,11 +123,9 @@ class Video extends Audio } // If the user passed some additional parameters - if ($format instanceof VideoInterface) { - if (null !== $format->getAdditionalParameters()) { - foreach ($format->getAdditionalParameters() as $additionalParameter) { - $commands[] = $additionalParameter; - } + if (null !== $format->getAdditionalParameters()) { + foreach ($format->getAdditionalParameters() as $additionalParameter) { + $commands[] = $additionalParameter; } } diff --git a/tests/Unit/Media/VideoTest.php b/tests/Unit/Media/VideoTest.php index 009a2f6..322ba53 100644 --- a/tests/Unit/Media/VideoTest.php +++ b/tests/Unit/Media/VideoTest.php @@ -449,60 +449,81 @@ class VideoTest extends AbstractStreamableTestCase return array( array(false, array(array( - '-y', '-i', __FILE__, '-b:v', '663k', - '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', - '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', - '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', 2, 'foo', 'bar', '-pass', 1, '-passlogfile', - '/target/file', - ), array( - '-y', '-i', __FILE__, + '-y', + '-i', __FILE__, '-b:v', '663k', - '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', - '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', - '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', 2, 'foo', 'bar', '-pass', 2, '-passlogfile', - '/target/file', + '-refs', '6', + '-coder', '1', + '-sc_threshold', '40', + '-flags', '+loop', + '-me_range', '16', + '-subq', '7', + '-i_qfactor', '0.71', + '-qcomp', '0.6', + '-qdiff', '4', + '-trellis', '1', + '-b:a', '92k', + '-ac', 2, + 'foo', 'bar', + '-pass', 1, + '-passlogfile', '/target/file', + ), array( + '-y', + '-i', __FILE__, + '-b:v', '663k', + '-refs', '6', + '-coder', '1', + '-sc_threshold', '40', + '-flags', '+loop', + '-me_range', '16', + '-subq', '7', + '-i_qfactor', '0.71', + '-qcomp', '0.6', + '-qdiff', '4', + '-trellis', '1', + '-b:a', '92k', + '-ac', 2, + 'foo', 'bar', + '-pass', 2, + '-passlogfile', '/target/file' )), null, $format), array(false, array(array( - '-y', '-i', __FILE__, - '-vcodec', 'gloubi-boulga-video', - '-acodec', 'patati-patata-audio', '-b:v', '664k', - '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', - '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', - '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '1', '-passlogfile', - '/target/file', + '-y', + '-i', __FILE__, + 'extra', 'param', + '-b:v', '665k', + '-refs', '6', + '-coder', '1', + '-sc_threshold', '40', + '-flags', '+loop', + '-me_range', '16', + '-subq', '7', + '-i_qfactor', '0.71', + '-qcomp', '0.6', + '-qdiff', '4', + '-trellis', '1', + '-b:a', '92k', + '-ac', '2', + '-pass', '1', + '-passlogfile', '/target/file', ), array( '-y', '-i', __FILE__, - '-vcodec', 'gloubi-boulga-video', - '-acodec', 'patati-patata-audio', - '-b:v', '664k', - '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', - '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', - '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '2', '-passlogfile', - '/target/file', - )), null, $audioVideoFormat), - array(false, array(array( - '-y', '-i', __FILE__, - '-vcodec', 'gloubi-boulga-video', - '-acodec', 'patati-patata-audio', '-b:v', '664k', - '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', - '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', - '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', - '/target/file', - )), null, $audioVideoFormatSinglePass), - array(false, array(array( - '-y', '-i', __FILE__, - 'extra', 'param','-b:v', '665k', - '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', - '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', - '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '1', '-passlogfile', - '/target/file', - ), array( - '-y', '-i', __FILE__, - 'extra', 'param', '-b:v', '665k', - '-refs', '6', '-coder', '1', '-sc_threshold', '40', '-flags', '+loop', - '-me_range', '16', '-subq', '7', '-i_qfactor', '0.71', '-qcomp', '0.6', - '-qdiff', '4', '-trellis', '1', '-b:a', '92k', '-ac', '2', '-pass', '2', '-passlogfile', - '/target/file', + 'extra', 'param', + '-b:v', '665k', + '-refs', '6', + '-coder', '1', + '-sc_threshold', '40', + '-flags', '+loop', + '-me_range', '16', + '-subq', '7', + '-i_qfactor', '0.71', + '-qcomp', '0.6', + '-qdiff', '4', + '-trellis', '1', + '-b:a', '92k', + '-ac', '2', + '-pass', '2', + '-passlogfile', '/target/file', )), null, $formatExtra), array(true, array(array( '-y', '-i', __FILE__,