{"id":14985071,"url":"https://github.com/jack-theripper/transcoder","last_synced_at":"2025-04-10T23:24:40.964Z","repository":{"id":56949749,"uuid":"79135384","full_name":"jack-theripper/transcoder","owner":"jack-theripper","description":"[IN PROGRESS] Tools to transcoding/encoding audio or video, inspect and convert media formats.","archived":false,"fork":false,"pushed_at":"2019-07-02T15:45:04.000Z","size":326,"stargazers_count":31,"open_issues_count":2,"forks_count":5,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-24T20:12:25.763Z","etag":null,"topics":["audio","converting","ffmpeg","php","transcoding","video"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jack-theripper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-01-16T16:12:17.000Z","updated_at":"2020-08-03T10:21:40.000Z","dependencies_parsed_at":"2022-08-21T08:20:22.415Z","dependency_job_id":null,"html_url":"https://github.com/jack-theripper/transcoder","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jack-theripper%2Ftranscoder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jack-theripper%2Ftranscoder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jack-theripper%2Ftranscoder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jack-theripper%2Ftranscoder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jack-theripper","download_url":"https://codeload.github.com/jack-theripper/transcoder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248313548,"owners_count":21082876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio","converting","ffmpeg","php","transcoding","video"],"created_at":"2024-09-24T14:10:14.770Z","updated_at":"2025-04-10T23:24:40.944Z","avatar_url":"https://github.com/jack-theripper.png","language":"PHP","readme":"# Transcoder [![Latest Version](https://img.shields.io/github/release/jack-theripper/transcoder.svg?style=flat-square)](https://github.com/jack-theripper/transcoder/releases) \n\nTools to transcoding/encoding audio or video, inspect and convert media formats.\n\nИнструмент для кодирования аудио или видео, получения информации и конвертирования в другие форматы.\n\n## Содержание\n\n- [С чего начать](#С-чего-начать)\n\t- [Установка](#Установка)\n\t- [Требования](#Требования)\n- [События](#События)\n\t- [before](#Событие-before)\n\t- [before.pass](#Событие-beforepass)\n\t- [before.queue](#Событие-beforequeue)\n\t- [successful](#Событие-successful)\n\t- [failure](#Событие-failure)\n\t- [failure.codec](#Событие-failurecodec)\n\t- [after](#Событие-after)\n\t- [after.pass](#Событие-afterpass)\n\t- [after.queue](#Событие-afterqueue)\n\t- [progress](#Событие-progress)\n\t- [stream](#Событие-stream)\n- [Фильтры](#Фильтры)\n\t- [Простой фильтр](#Простой-фильтр-simplefilter)\n\t- [Задержка звука](#Задержка-звука)\n- [Примеры](#Примеры)\n\t- [Наложение текста](#Наложение-текста)\n\t\n\n## С чего начать\n\nВ зависимости от контента, вы можете использовать `Audio` для работы с аудио-файлами, `Frame` для изображений, а `Video` и `Subtitle` соответственно для работы с видео-файлами и субтитрами.\n\n```php\nuse Arhitector\\Transcoder\\Audio;\nuse Arhitector\\Transcoder\\Video;\nuse Arhitector\\Transcoder\\Frame;\nuse Arhitector\\Transcoder\\Subtitle;\n```\n\nКонструктор в общем виде выглядит так:\n\n```php\npublic \u003c ... \u003e::__construct(string $filePath, ServiceFactoryInterface $service = null)\n```\n\n`$filePath` - строка, путь до исходного файла.\n\n\u003e Вы не можете использовать удаленный источник или символические ссылки.\n\n`$service` - параметр не обязателен. Экземпляр сервиса. По умолчанию   `ServiceFactory`.\n\n```php\n$audio = new Audio('sample.mp3');\n$video = new Video('sample.avi');\n$frame = new Frame('sample.jpg');\n$subtitle = new Subtitle('sample.srt');\n```\n\nВы можете использовать свою сервис-фабрику или изменить некоторые опции.\n\n```php\nuse Arhitector\\Transcoder\\Service\\ServiceFactory;\n\n$service = new ServiceFactory([\n\t'ffprobe.path' =\u003e 'E:\\devtools\\bin\\ffprobe.exe',\n\t'ffmpeg.path'  =\u003e 'E:\\devtools\\bin\\ffmpeg.exe'\n]);\n\n// используем это\n$video = new Video('sample.avi', $service);\n```\n\n## Установка\n\n```bash\n$ composer require --prefer-dist arhitector/transcoder dev-master\n```\n\n## Требования\n\n* PHP \u003e= 5.6\n* Установленный [FFMpeg](http://ffmpeg.org)\n\n## События\n\nЭкземпляр формата регистрирует обработчики, такой обработчик будет выполнен при наступлении определённого события.\nМетоды `addListener` или `addOneListener` регистрируют обработчик на событие. Читать подробнее [League\\Event](http://event.thephpleague.com/2.0/).\n\n```php\n$format = new VideoFormat();\n$format-\u003eaddListener('*', function ($event) {\n\t// \"*\" - обработчик сработает на любое событие\n});\n```\n\nВ зависимости от события, обработчик может повлиять на дальнейший ход выполнения операции.\n\n```php\n$format-\u003eaddListener('before', function ($event) {\n\t$event-\u003estopPropagation(); // дальнейшее выполнение будет остановлено\n});\n```\n\n### Событие before\n\nВыполняется перед началом кодирования. Дальнейшее выполнение может быть остановлено.\n\n```php\n$format-\u003eaddListener('before', function ($event, $media, $format, $filePath) {\n\t// обработчик сработает после вызова `$media-\u003esave($format, ...`\n});\n```\n\n### Событие before.pass\n\nПри многопроходном кодировании обработчик будет вызван перед каждым проходом.\nСобытие срабатывает минимум 1 раз.\n\nСобытие срабатывает после `before` и не может отменить процесс кодирования.\n\n```php\nuse Symfony\\Component\\Process\\Process;\n\n$format-\u003eaddListener('before.pass', function ($event, $media, $format, Process $process) {\n\t\n});\n```\n\n### Событие before.queue\n\n### Событие successful\n\nСобытие наступает в том случае, если кодирование завершино без ошибок.\nПри использовании очередей - в том случае, если задание добавлено в очередь.\n\n```php\n$format-\u003eaddListener('successful', function ($event, $media, $format, $filePath) {\n\t// работа завершена без ошибок\n});\n```\n\n### Событие failure\n\nОперация завершилась с ошибкой или не может корректно завершиться.\n\n```php\nuse Symfony\\Component\\Process\\Exception\\ProcessFailedException;\n\n$format-\u003eaddListener('failure', function ($event, ProcessFailedException $exception) {\n\t// кодирование не может быть завершено из-за возникшей ошибки\n});\n```\n\n### Событие failure.codec\n\n### Событие after\n\nОбработчик будет вызван когда операция завершится, не зависимо от того была ли операция завершена успешно или нет. \n\n```php\n$format-\u003eaddListener('after', function ($event, $media, $format, $filePath) {\n\t// операция завершилась, но мы не знаем успешно или нет\n});\n```\n\n### Событие after.pass\n\nСрабатывает после завершения прохода при многопроходном кодировании. Будет вызвано минимум 1 раз.\n\n```php\nuse Symfony\\Component\\Process\\Process;\n\n$format-\u003eaddListener('after.pass', function ($event, $media, $format, Process $process) {\n\t\n});\n```\n\n### Событие after.queue\n\n### Событие progress\n\nСобытие наступает во время выполнения операции кодирования.\n\n```php\nuse Arhitector/Transcoder/Event/EventProgress;\n\n$format-\u003eaddListener('progress', function (EventProgress $event) {\n\t// $event-\u003egetPercent();\n});\n```\n\n### Событие stream\n\n### Поддержка очередей\n\nВместо прямого транскодирования вы можете отправлять задачи в очередь, например, на сервер очередей. Такой функционал\n доступен прямо из коробки. Вы можете использовать опцию `ServiceFactoryInterface::OPTION_USE_QUEUE` при создании сервис-фабрики.\nЧитать подробнее [SimpleQueue](https://github.com/fguillot/simple-queue).\n\n**Пример**\n\n```php\n$adapter = new SimpleQueue\\Adapter\\MemoryQueueAdapter();\n$queue = new SimpleQueue\\Queue($queue);\n\n$service = new Arhitector\\Transcoder\\Service\\ServiceFactory([\n    Arhitector\\Transcoder\\Service\\ServiceFactory::OPTION_USE_QUEUE =\u003e $queue\n]);\n\n$audio = new Arhitector\\Transcoder\\Audio('sample.mp3', $service);\n\n// задача будет отправлена в очередь `$queue`\n$audio-\u003esave($audio-\u003egetFormat(), 'new-sample.mp3');\n\nvar_dump($queue-\u003epull()); // запросить задачу из очереди\n```\n\n## Что можно настроить? Поддерживаемые опции\n\n###  Опции сервис-фабрики\n\nВы можете использовать свою реализацию сервис-фабрики. Для этого необходимо реализовать интерфейс `Arhitector\\Transcoder\\Service\\ServiceFactoryInterface`.\n \n`ServiceFactory` поддерживает следующие опции:\n\n1. `ffmpeg.path` - путь до исполняемого файла ffmpeg\n\n1. `ffmpeg.threads` - FFMpeg-опция threads. По умолчанию `0`.\n\n1. `ffprobe.path` - путь до исполняемого файла ffprobe\n\n1. `timeout` - задаёт таймаут выполнения команды кодирования.\n\n1. `use_queue` - Отправляет задачу в очередь. Значение должно быть объектом, реализующим `SimpleQueue\\QueueAdapterInterface`.\n\n## Примеры \n\n### Извлечение информации из видео файла, аудио файла и т.д.\n\n```php\nuse Arhitector\\Transcoder\\Video;\nuse Arhitector\\Transcoder\\Audio;\n\n$video = new Video('sample.avi');\n\nvar_dump($video-\u003egetWidth(), $video-\u003egetHeight());\n\n$audio = new Audio(__DIR__.'/audio.mp3', $factory);\n\nvar_dump($audio-\u003egetAudioChannels());\nvar_dump($audio-\u003egetFormat()-\u003egetTags());\n```\n\n### Извлечение звука из видео файла с последующим сохранением в формате MP3\n\nЭтот простой пример показывает лишь принцип, таким же способом можно сохранить субтитры или обложку из Mp3-файла и т.д.\n\n```php\nuse Arhitector\\Transcoder\\Video;\nuse Arhitector\\Transcoder\\Stream\\AudioStreamInterface;\nuse Arhitector\\Transcoder\\Format\\Mp3;\n\n$video = new Video('sample.mp4');\n\nforeach ($video-\u003egetStreams() as $stream)\n{\n\t// тут выбираем только аудио канал\n\tif ($stream instanceof AudioStreamInterface)\n\t{\n\t\t$stream-\u003esave(new Mp3(), __DIR__.'/only-audio.mp3');\n\t\t\n\t\tbreak; // видео может иметь несколько аудио потоков\n\t}\n}\n```\n\n### Преобразование из одного формата в любой другой\n\n```php\nuse Arhitector\\Transcoder\\Audio;\nuse Arhitector\\Transcoder\\Format\\Mp3;\n\n$audio = new Audio('audio-file.wav');\n$audio-\u003esave(new Mp3(), 'audio-file.mp3');\n\nuse Arhitector\\Transcoder\\Video;\nuse Arhitector\\Transcoder\\Format\\VideoFormat;\n\n$video = new Video('video-file.avi');\n$video-\u003esave(new VideoFormat('aac', 'h264'), 'video-file.mp4');\n```\n\n### Добавление/Изменение мета-информации\n\n```php\nuse Arhitector\\Transcoder\\Audio;\n\n$audio = new Audio('file.mp3');\n\n$format = $audio-\u003egetFormat();\n$format['artist'] = 'Новый артист';\n\n$auiod-\u003esave($format, 'new-file.mp3');\n```\n\n### Как добавить/изменить обложку MP3-файла?\n\n```php\nuse Arhitector\\Transcoder\\Audio;\nuse Arhitector\\Transcoder\\Frame;\n\n$audio = new Audio(__DIR__.'/sample.mp3');\n$streams = $audio-\u003egetStreams();\n\n$new_cover = (new Frame(__DIR__.'/sample.jpg'))\n    -\u003egetStreams()\n    -\u003egetFirst();\n\n// индекс `0` - аудио-дорожка, `1` - обложка.\n$streams[1] = $new_cover;\n\n$audio-\u003esave($audio-\u003egetFormat(), 'sample-with-new-cover.mp3');\n```\n\n### Наложение текста\n\n```php\nuse Arhitector\\Transcoder\\Video;\nuse Arhitector\\Transcoder\\Filter\\Text;\nuse Arhitector\\Transcoder\\Point;\n\n$filter = new Text('Наложение текста на кадр');\n$filter-\u003esetSize(24);\n$filter-\u003esetColor('red');\n$filter-\u003esetPosition(new Point(100, 100));\n\n$video = new Video('sample.mp4');\n$video-\u003eaddFilter($filter);\n$video-\u003esave($video-\u003egetFormat(), 'sample-with-text.mp4');\n```\n\n## ООП-обёртки над форматами\n\nТакие обёртки (например, Mp3 или Jpeg и т.д.) созданы для удобства. \n\n### Изображения\n\n- Png, Jpeg, Ppm, Bmp, Gif\n\n### Аудио-форматы\n\n- Aac, Mp3, Oga, Flac\n\n### Видео-форматы\n\n- Flv, Mkv\n\n## Фильтры\n\nФильтры необходимы для изменения исходного медиа контента. Могут иметь один или несколько входов и выходов, а также быть организованы в цепочки для изоляции некоторых фильтров друг от друга.\n\n```php\npublic TranscodeInterface::addFilter(FilterInterface $filter, $priority = 0);\n```\n\nАудио фильтры реализуют интерфейс `AudioFilterInterface` и могут использоваться совместно только с `Audio` или `Video`.\n\nВидео фильтры реализуют интерфейсы `FrameFilterInterface` или `VideoFilterInterface`, используются либо с `Frame` либо с `Video`.\n\n```php\n// добавляем любой фильтр\n$video-\u003eaddFilter($filter);\n\n// добавляем фильтр с приоритетом = 99.\n$audio-\u003eaddFilter($filter, 99);\n```\n\n#### Простой фильтр, SimpleFilter\n\nЭто самый простой фильтр, который позволяет устанавливать свои параметры для командной строки `ffmpeg`.\n\n```php\nuse Arhitector\\Transcoder\\Filter\\SimpleFilter;\n```\n\n**Конструктор**\n\n```php\npublic SimpleFilter::__construct(array $parameters = [])\n```\n\nСоздадим экземпляр и добавим параметр 'video_codec'.\n\n```php\n$filter = new SimpleFilter([\n\t'video_codec' =\u003e 'h264'\n]);\n```\n\nЭтот метод перезапишет ранее установленные значения.\n\n```php\n$filter-\u003esetParameters([\n\t'video_codec' =\u003e 'libx264'\n]);\n\n// ArrayAccess\n$filter['video_codec'] = 'x264';\n```\n\n### Фильтр Cut\n\nАудио фильтр, который позволяет обрезать медиа-файл до определённых значений продолжительности.\n\n```php\nuse Arhitector\\Transcoder\\Filter\\Cut;\n```\n\n**Конструктор**\n\n```php\npublic Cut::__construct(TimeInterval|int $start [, TimeInterval $duration = null])\n```\n\n**Пример №1**\n\nПропустить 20 секунд от начала и сохранить последующие 60 секунд.\n\n```php\n$filter = new Cut(new TimeInterval(20), new TimeInterval(60));\n```\n\n### Фильтр Volume\n\nАудио фильтр, который изменяет громкость аудио потока.\n\n```php\nuse \\Arhitector\\Transcoder\\Filter\\Volume;\n```\n\n**Конструктор**\n\n```php\npublic Volume::__construct(float $volume [, string $precision = null])\n```\n\n**Пример №1**\n\nПример показывает как уменьшить громкость аудио.\n\n```php\n$filter = new Volume(0.5);\n$filter = new Volume(1/2);\n$filter = new Volume('6.0206dB');\n```\n\n**Пример №2**\n\nУвеличение входной мощности звука на 6 дБ с фиксированной точностью.\n\n```php\n$filter = new Volume('6dB', Volume::PRECISION_FIXED);\n```\n\n### Фильтр Fade\n\nФильтр накладывает эффект затухания звука на аудио дорожку.\n\n```php\nuse \\Arhitector\\Transcoder\\Filter\\Fade;\n```\n\n**Конструктор**\n\n```php\npublic Fade::__construct(TimeInterval|int $startTime = 0 [, TimeInterval|int $duration = null [, string $effectType = null]])\n```\n\n**Пример №1**\n\n```php\nnew Fade(2, 10, Fade::FADE_OUT)\n```\n\n### Фильтр AudioDelay\n\n```php\nuse \\Arhitector\\Transcoder\\Filter\\AudioDelay;\n```\n\n### Фильтр Rotate\n\n```php\nuse \\Arhitector\\Transcoder\\Filter\\Rotate;\n```\n\n**Конструктор**\n\n```php\npublic Rotate::__construct($angle = null)\n```\n\n### Фильтр Crop\n\n```php\nuse \\Arhitector\\Transcoder\\Filter\\Crop;\n```\n\n**Конструктор**\n\n```php\npublic Crop::__construct(Point $start, Dimension $dimension)\n```\n\n## Лицензия\n\nРаспространяется под лицензией \u003ca href=\"http://opensource.org/licenses/MIT\"\u003eMIT\u003c/a\u003e.\n\n```\nCopyright (c) 2017 Dmitry Arhitector\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjack-theripper%2Ftranscoder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjack-theripper%2Ftranscoder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjack-theripper%2Ftranscoder/lists"}