From de5cf914da26b6a2edbb0045c38bb25796f4d2bf Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Tue, 23 Aug 2022 15:25:27 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20Add=20stream=20to=20map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Still need to handle the codecs. But almost there. --- src/Map.php | 22 +++++++---- src/MappableMedia.php | 2 +- src/Stream.php | 76 ++++++++++++++++++++++++++++++++++++++ src/Traits/HasMetadata.php | 21 +++++++++++ 4 files changed, 113 insertions(+), 8 deletions(-) create mode 100644 src/Stream.php create mode 100644 src/Traits/HasMetadata.php diff --git a/src/Map.php b/src/Map.php index b427110..d2d638f 100644 --- a/src/Map.php +++ b/src/Map.php @@ -4,11 +4,12 @@ namespace Danjones\FFMpeg; class Map { + use Traits\HasMetadata; + protected MappableMedia $media; protected string $path; /** @var Stream[] */ protected array $streams = []; - protected array $metadata = []; public function __construct(MappableMedia $media) { @@ -29,15 +30,22 @@ class Map return $this; } - public function addMetadata(array|string $keyOrData, string $value = null): static + public function stream(callable $callback = null): Stream|static { - if (is_array($keyOrData)) { - array_walk($keyOrData, fn($v, $k) => $this->addMetadata($k, $v)); - - return $this; + $stream = new Stream($this); + if (!$callback) { + return $stream; } - $this->metadata[$keyOrData] = $value; + $callback($stream); + $this->saveStream($stream); + + return $this; + } + + public function saveStream(Stream $stream): static + { + $this->streams[] = $stream; return $this; } diff --git a/src/MappableMedia.php b/src/MappableMedia.php index c25530b..6bede7c 100644 --- a/src/MappableMedia.php +++ b/src/MappableMedia.php @@ -149,7 +149,7 @@ class MappableMedia extends AbstractMediaType return $this; } - public function saveMap($map): static + public function saveMap(Map $map): static { $this->maps[] = $map; diff --git a/src/Stream.php b/src/Stream.php new file mode 100644 index 0000000..e8957e2 --- /dev/null +++ b/src/Stream.php @@ -0,0 +1,76 @@ +map = $map; + } + + public function setInput(string $input): static + { + $this->input = $input; + + return $this; + } + + public function addFlag(string $key, string $value): static + { + $this->flags[$key] = $value; + + return $this; + } + + public function setCodec(FormatInterface $codec): static + { + $this->codec = $codec; + + return $this; + } + + protected function parseCodec(): static + { + // @todo + $this->addFlag('c', 'libx265'); + + return $this; + } + + public function saveStream(): Map + { + $this->map->saveStream($this); + + return $this->map; + } + + public function buildCommand(int $idx = 0): array + { + $this->parseCodec(); + + $commands = []; + + $commands[] = '-map'; + $commands[] = $this->input; + + foreach ($this->flags as $k => $v) { + array_push($commands, "-{$k}:{$idx}", $v); + } + + foreach ($this->metadata as $k => $v) { + array_push($commands, "-metadata:s:{$idx}", "{$k}={$v}"); + } + + return $commands; + } +} diff --git a/src/Traits/HasMetadata.php b/src/Traits/HasMetadata.php new file mode 100644 index 0000000..abf997b --- /dev/null +++ b/src/Traits/HasMetadata.php @@ -0,0 +1,21 @@ + $this->addMetadata($k, $v)); + + return $this; + } + + $this->metadata[$keyOrData] = $value; + + return $this; + } +}