2017 © Pedro PelΓ‘ez
 

library jumper

Tools to transcoding/encoding audio or video, inspect and convert media formats.

image

arhitector/jumper

Tools to transcoding/encoding audio or video, inspect and convert media formats.

  • Friday, July 13, 2018
  • by Arhitector
  • Repository
  • 5 Watchers
  • 30 Stars
  • 0 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 3 Forks
  • 2 Open issues
  • 2 Versions
  • 0 % Grown

The README.md

Transcoder Latest Version

Tools to transcoding/encoding audio or video, inspect and convert media formats., (*1)

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ для кодирования Π°ΡƒΠ΄ΠΈΠΎ ΠΈΠ»ΠΈ Π²ΠΈΠ΄Π΅ΠΎ, получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ конвСртирования Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹., (*2)

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Π‘ Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ

Π’ зависимости ΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Audio для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π°ΡƒΠ΄ΠΈΠΎ-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, Frame для ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π° Video ΠΈ Subtitle соотвСтствСнно для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²ΠΈΠ΄Π΅ΠΎ-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ субтитрами., (*3)

use Arhitector\Transcoder\Audio;
use Arhitector\Transcoder\Video;
use Arhitector\Transcoder\Frame;
use Arhitector\Transcoder\Subtitle;

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Π² ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ выглядит Ρ‚Π°ΠΊ:, (*4)

public < ... >::__construct(string $filePath, ServiceFactoryInterface $service = null)

$filePath - строка, ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ исходного Ρ„Π°ΠΉΠ»Π°., (*5)

Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ источник ΠΈΠ»ΠΈ символичСскиС ссылки., (*6)

$service - ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ обязатСлСн. ЭкзСмпляр сСрвиса. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ServiceFactory., (*7)

$audio = new Audio('sample.mp3');
$video = new Video('sample.avi');
$frame = new Frame('sample.jpg');
$subtitle = new Subtitle('sample.srt');

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свою сСрвис-Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ., (*8)

use Arhitector\Transcoder\Service\ServiceFactory;

$service = new ServiceFactory([
    'ffprobe.path' => 'E:\devtools\bin\ffprobe.exe',
    'ffmpeg.path'  => 'E:\devtools\bin\ffmpeg.exe'
]);

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ это
$video = new Video('sample.avi', $service);

Установка

$ composer require --prefer-dist arhitector/transcoder dev-master

ВрСбования

  • PHP >= 5.6
  • УстановлСнный FFMpeg

Бобытия

ЭкзСмпляр Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° рСгистрируСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΡ€ΠΈ наступлСнии ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ события. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ addListener ΠΈΠ»ΠΈ addOneListener Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π° событиС. Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ League\Event., (*9)

$format = new VideoFormat();
$format->addListener('*', function ($event) {
    // "*" - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сработаСт Π½Π° любоС событиС
});

Π’ зависимости ΠΎΡ‚ события, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° дальнСйший Ρ…ΠΎΠ΄ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ., (*10)

$format->addListener('before', function ($event) {
    $event->stopPropagation(); // дальнСйшСС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ остановлСно
});

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ before

ВыполняСтся ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ кодирования. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ остановлСно., (*11)

$format->addListener('before', function ($event, $media, $format, $filePath) {
    // ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сработаСт послС Π²Ρ‹Π·ΠΎΠ²Π° `$media->save($format, ...`
});

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ before.pass

ΠŸΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠΌ. Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ срабатываСт ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 1 Ρ€Π°Π·., (*12)

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ срабатываСт послС before ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ процСсс кодирования., (*13)

use Symfony\Component\Process\Process;

$format->addListener('before.pass', function ($event, $media, $format, Process $process) {

});

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ before.queue

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ successful

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ наступаСт Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ½ΠΎ Π±Π΅Π· ошибок. ΠŸΡ€ΠΈ использовании ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ - Π² Ρ‚ΠΎΠΌ случаС, Ссли Π·Π°Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ., (*14)

$format->addListener('successful', function ($event, $media, $format, $filePath) {
    // Ρ€Π°Π±ΠΎΡ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° Π±Π΅Π· ошибок
});

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ failure

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ с ошибкой ΠΈΠ»ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ., (*15)

use Symfony\Component\Process\Exception\ProcessFailedException;

$format->addListener('failure', function ($event, ProcessFailedException $exception) {
    // ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ ΠΈΠ·-Π·Π° возникшСй ошибки
});

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ failure.codec

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ after

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΊΠΎΠ³Π΄Π° опСрация Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Π½Π΅ зависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ Π±Ρ‹Π»Π° Π»ΠΈ опСрация Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚., (*16)

$format->addListener('after', function ($event, $media, $format, $filePath) {
    // опСрация Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ, Π½ΠΎ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚
});

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ after.pass

Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Π‘ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 1 Ρ€Π°Π·., (*17)

use Symfony\Component\Process\Process;

$format->addListener('after.pass', function ($event, $media, $format, Process $process) {

});

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ after.queue

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ progress

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ наступаСт Π²ΠΎ врСмя выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ кодирования., (*18)

use Arhitector/Transcoder/Event/EventProgress;

$format->addListener('progress', function (EventProgress $event) {
    // $event->getPercent();
});

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ stream

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ

ВмСсто прямого транскодирования Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° сСрвСр ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ. Π’Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» доступСн прямо ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ ServiceFactoryInterface::OPTION_USE_QUEUE ΠΏΡ€ΠΈ создании сСрвис-Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ. Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ SimpleQueue., (*19)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, (*20)

$adapter = new SimpleQueue\Adapter\MemoryQueueAdapter();
$queue = new SimpleQueue\Queue($queue);

$service = new Arhitector\Transcoder\Service\ServiceFactory([
    Arhitector\Transcoder\Service\ServiceFactory::OPTION_USE_QUEUE => $queue
]);

$audio = new Arhitector\Transcoder\Audio('sample.mp3', $service);

// Π·Π°Π΄Π°Ρ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ `$queue`
$audio->save($audio->getFormat(), 'new-sample.mp3');

var_dump($queue->pull()); // Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ? ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ

ΠžΠΏΡ†ΠΈΠΈ сСрвис-Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ сСрвис-Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс Arhitector\Transcoder\Service\ServiceFactoryInterface., (*21)

ServiceFactory ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ:, (*22)

  1. ffmpeg.path - ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π° ffmpeg, (*23)

  2. ffmpeg.threads - FFMpeg-опция threads. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 0., (*24)

  3. ffprobe.path - ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π° ffprobe, (*25)

  4. timeout - Π·Π°Π΄Π°Ρ‘Ρ‚ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ кодирования., (*26)

  5. use_queue - ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ Π·Π°Π΄Π°Ρ‡Ρƒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌ SimpleQueue\QueueAdapterInterface., (*27)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Π²ΠΈΠ΄Π΅ΠΎ Ρ„Π°ΠΉΠ»Π°, Π°ΡƒΠ΄ΠΈΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ‚.Π΄.

use Arhitector\Transcoder\Video;
use Arhitector\Transcoder\Audio;

$video = new Video('sample.avi');

var_dump($video->getWidth(), $video->getHeight());

$audio = new Audio(__DIR__.'/audio.mp3', $factory);

var_dump($audio->getAudioChannels());
var_dump($audio->getFormat()->getTags());

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π·Π²ΡƒΠΊΠ° ΠΈΠ· Π²ΠΈΠ΄Π΅ΠΎ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ сохранСниСм Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ MP3

Π­Ρ‚ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ лишь ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ способом ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ субтитры ΠΈΠ»ΠΈ ΠΎΠ±Π»ΠΎΠΆΠΊΡƒ ΠΈΠ· Mp3-Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ‚.Π΄., (*28)

use Arhitector\Transcoder\Video;
use Arhitector\Transcoder\Stream\AudioStreamInterface;
use Arhitector\Transcoder\Format\Mp3;

$video = new Video('sample.mp4');

foreach ($video->getStreams() as $stream)
{
    // Ρ‚ΡƒΡ‚ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΡƒΠ΄ΠΈΠΎ ΠΊΠ°Π½Π°Π»
    if ($stream instanceof AudioStreamInterface)
    {
        $stream->save(new Mp3(), __DIR__.'/only-audio.mp3');

        break; // Π²ΠΈΠ΄Π΅ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько Π°ΡƒΠ΄ΠΈΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²
    }
}

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ

use Arhitector\Transcoder\Audio;
use Arhitector\Transcoder\Format\Mp3;

$audio = new Audio('audio-file.wav');
$audio->save(new Mp3(), 'audio-file.mp3');

use Arhitector\Transcoder\Video;
use Arhitector\Transcoder\Format\VideoFormat;

$video = new Video('video-file.avi');
$video->save(new VideoFormat('aac', 'h264'), 'video-file.mp4');

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ИзмСнСниС ΠΌΠ΅Ρ‚Π°-ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

use Arhitector\Transcoder\Audio;

$audio = new Audio('file.mp3');

$format = $audio->getFormat();
$format['artist'] = 'Новый артист';

$auiod->save($format, 'new-file.mp3');

Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ/ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±Π»ΠΎΠΆΠΊΡƒ MP3-Ρ„Π°ΠΉΠ»Π°?

use Arhitector\Transcoder\Audio;
use Arhitector\Transcoder\Frame;

$audio = new Audio(__DIR__.'/sample.mp3');
$streams = $audio->getStreams();

$new_cover = (new Frame(__DIR__.'/sample.jpg'))
    ->getStreams()
    ->getFirst();

// индСкс `0` - Π°ΡƒΠ΄ΠΈΠΎ-Π΄ΠΎΡ€ΠΎΠΆΠΊΠ°, `1` - ΠΎΠ±Π»ΠΎΠΆΠΊΠ°.
$streams[1] = $new_cover;

$audio->save($audio->getFormat(), 'sample-with-new-cover.mp3');

НалоТСниС тСкста

use Arhitector\Transcoder\Video;
use Arhitector\Transcoder\Filter\Text;
use Arhitector\Transcoder\Point;

$filter = new Text('НалоТСниС тСкста Π½Π° ΠΊΠ°Π΄Ρ€');
$filter->setSize(24);
$filter->setColor('red');
$filter->setPosition(new Point(100, 100));

$video = new Video('sample.mp4');
$video->addFilter($filter);
$video->save($video->getFormat(), 'sample-with-text.mp4');

ООП-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ Π½Π°Π΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ

Π’Π°ΠΊΠΈΠ΅ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Mp3 ΠΈΠ»ΠΈ Jpeg ΠΈ Ρ‚.Π΄.) созданы для удобства., (*29)

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ

  • Png, Jpeg, Ppm, Bmp, Gif

Аудио-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹

  • Aac, Mp3, Oga, Flac

Π’ΠΈΠ΄Π΅ΠΎ-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹

  • Flv, Mkv

Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹

Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для измСнСния исходного ΠΌΠ΅Π΄ΠΈΠ° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. ΠœΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π²Ρ…ΠΎΠ΄ΠΎΠ² ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ для изоляции Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°., (*30)

public TranscodeInterface::addFilter(FilterInterface $filter, $priority = 0);

Аудио Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйс AudioFilterInterface ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Audio ΠΈΠ»ΠΈ Video., (*31)

Π’ΠΈΠ΄Π΅ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйсы FrameFilterInterface ΠΈΠ»ΠΈ VideoFilterInterface, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π»ΠΈΠ±ΠΎ с Frame Π»ΠΈΠ±ΠΎ с Video., (*32)

// добавляСм любой Ρ„ΠΈΠ»ΡŒΡ‚Ρ€
$video->addFilter($filter);

// добавляСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ = 99.
$audio->addFilter($filter, 99);

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, SimpleFilter

Π­Ρ‚ΠΎ самый простой Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ свои ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ffmpeg., (*33)

use Arhitector\Transcoder\Filter\SimpleFilter;

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, (*34)

public SimpleFilter::__construct(array $parameters = [])

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ экзСмпляр ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 'video_codec'., (*35)

$filter = new SimpleFilter([
    'video_codec' => 'h264'
]);

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Ρ€Π°Π½Π΅Π΅ установлСнныС значСния., (*36)

$filter->setParameters([
    'video_codec' => 'libx264'
]);

// ArrayAccess
$filter['video_codec'] = 'x264';

Π€ΠΈΠ»ΡŒΡ‚Ρ€ Cut

Аудио Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΎΠ±Ρ€Π΅Π·Π°Ρ‚ΡŒ ΠΌΠ΅Π΄ΠΈΠ°-Ρ„Π°ΠΉΠ» Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ., (*37)

use Arhitector\Transcoder\Filter\Cut;

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, (*38)

public Cut::__construct(TimeInterval|int $start [, TimeInterval $duration = null])

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–1, (*39)

ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ 20 сСкунд ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ 60 сСкунд., (*40)

$filter = new Cut(new TimeInterval(20), new TimeInterval(60));

Π€ΠΈΠ»ΡŒΡ‚Ρ€ Volume

Аудио Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ измСняСт Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ Π°ΡƒΠ΄ΠΈΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°., (*41)

use \Arhitector\Transcoder\Filter\Volume;

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, (*42)

public Volume::__construct(float $volume [, string $precision = null])

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–1, (*43)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ Π°ΡƒΠ΄ΠΈΠΎ., (*44)

$filter = new Volume(0.5);
$filter = new Volume(1/2);
$filter = new Volume('6.0206dB');

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–2, (*45)

Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ мощности Π·Π²ΡƒΠΊΠ° Π½Π° 6 Π΄Π‘ с фиксированной Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ., (*46)

$filter = new Volume('6dB', Volume::PRECISION_FIXED);

Π€ΠΈΠ»ΡŒΡ‚Ρ€ Fade

Π€ΠΈΠ»ΡŒΡ‚Ρ€ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ эффСкт затухания Π·Π²ΡƒΠΊΠ° Π½Π° Π°ΡƒΠ΄ΠΈΠΎ Π΄ΠΎΡ€ΠΎΠΆΠΊΡƒ., (*47)

use \Arhitector\Transcoder\Filter\Fade;

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, (*48)

public Fade::__construct(TimeInterval|int $startTime = 0 [, TimeInterval|int $duration = null [, string $effectType = null]])

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–1, (*49)

new Fade(2, 10, Fade::FADE_OUT)

Π€ΠΈΠ»ΡŒΡ‚Ρ€ AudioDelay

use \Arhitector\Transcoder\Filter\AudioDelay;

Π€ΠΈΠ»ΡŒΡ‚Ρ€ Rotate

use \Arhitector\Transcoder\Filter\Rotate;

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, (*50)

public Rotate::__construct($angle = null)

Π€ΠΈΠ»ΡŒΡ‚Ρ€ Crop

use \Arhitector\Transcoder\Filter\Crop;

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, (*51)

public Crop::__construct(Point $start, Dimension $dimension)

ЛицСнзия

РаспространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT., (*52)

Copyright (c) 2017 Dmitry Arhitector

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

The Versions

13/07 2018

dev-master

9999999-dev

Tools to transcoding/encoding audio or video, inspect and convert media formats.

  Sources   Download

MIT

The Requires

 

The Development Requires

by Dmitry Arhitector

28/06 2018

dev-protocols

dev-protocols

Tools to transcoding/encoding audio or video, inspect and convert media formats.

  Sources   Download

MIT

The Requires

 

The Development Requires

by Dmitry Arhitector