Transcoder
, (*1)
ΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΠΈ, ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΡΠ°ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π΄Π»Ρ Π°ΡΠ΄ΠΈΠΎ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ., (*2)
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
- PHP 5.6 ΠΈΠ»ΠΈ Π½ΠΎΠ²Π΅Π΅
- Π£ΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ FFMpeg
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Composer., (*3)
$ composer require arhitector/transcoder dev-master
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π½Π΅ΡΡΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π² ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ°ΠΉΠ» composer.json ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ., (*4)
{
"require": {
"arhitector/transcoder": "dev-master"
}
}
ΠΠΊΠ°Π·Π°ΡΡ ΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅
ΠΠ°ΡΠ»ΠΈ ΠΎΡΠΈΠ±ΠΊΡ ΠΈΠ»ΠΈ Π΅ΡΡΡ ΠΈΠ΄Π΅Ρ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ? ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΎΡΠΊΡΠΎΠΉΡΠ΅ Π½ΠΎΠ²ΡΠΉ Π²ΠΎΠΏΡΠΎΡ., (*5)
Π‘ ΡΠ΅Π³ΠΎ Π½Π°ΡΠ°ΡΡ
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Audio Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π°ΡΠ΄ΠΈΠΎ-ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, Frame Π΄Π»Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, Π° Video ΠΈ Subtitle ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ Π΄Π»Ρ Π²ΠΈΠ΄Π΅ΠΎ-ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΡΡΠ±ΡΠΈΡΡΠΎΠ²., (*6)
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π² ΠΎΠ±ΡΠ΅ΠΌ Π²ΠΈΠ΄Π΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:, (*7)
public < ... >::__construct(string $filePath, ServiceFactoryInterface $service = null)
$filePath - ΡΡΡΠΎΠΊΠ°, ΠΏΡΡΡ Π΄ΠΎ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°., (*8)
ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΈΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ., (*9)
$service - ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½. ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ°. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ServiceFactory., (*10)
ΠΡΠΈΠΌΠ΅Ρ β1, (*11)
use Arhitector\Transcoder\Audio;
use Arhitector\Transcoder\Video;
use Arhitector\Transcoder\Frame;
use Arhitector\Transcoder\Subtitle;
// Π°ΡΠ΄ΠΈΠΎ
$audio = new Audio('sample.mp3');
// Π²ΠΈΠ΄Π΅ΠΎ
$video = new Video('sample.avi');
// ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
$frame = new Frame('sample.jpg');
// ΡΡΠ±ΡΠΈΡΡΡ
$subtitle = new Subtitle('sample.srt');
ΠΡΠΈΠΌΠ΅Ρ β2, (*12)
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΡ ΡΠ΅ΡΠ²ΠΈΡ-ΡΠ°Π±ΡΠΈΠΊΡ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΡΠΈΠΈ., (*13)
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);
Π‘ΠΎΠ±ΡΡΠΈΡ
ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠΎΡΠΌΠ°ΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ. Π§ΠΈΡΠ°ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ League\Event., (*14)
ΠΡΠΈΠΌΠ΅Ρ β1, (*15)
ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π° ΡΠΎΠ±ΡΡΠΈΠ΅., (*16)
$format = new VideoFormat();
$format->addListener('*', function ($event) {
// ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° Π»ΡΠ±ΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅
});
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ
-
before Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΡΠ°Π»ΠΎΠΌ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠ·Π²Π°Π² $event->stopPropagation().
ΠΡΠΈΠΌΠ΅Ρ β2, (*17)
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΌΠ΅Π½Π΅Π½Π° ΠΈ Π²ΡΠ·ΠΎΠ² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΠΎΠ±ΡΡΠΈΠΉ ΠΠ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ., (*18)
$format = new AudioFormat();
$format->addListener('before', function ($event) {
$event->stopPropagation();
});
-
before.pass ΡΠΎΠ±ΡΡΠΈΠ΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΎΠΌ ΠΏΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡ
ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ. ΠΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 1 ΡΠ°Π·., (*19)
-
success ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΠ»ΡΡΠ°Π΅ Π΅ΡΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠΏΠ΅ΡΠ½Π°., (*20)
-
progress ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π² Ρ
ΠΎΠ΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ., (*21)
ΠΡΠΈΠΌΠ΅Ρ β3, (*22)
$format = new VideoFormat();
$format->addListener('progress', function ($event) {
/* @var Arhitector/Transcoder/Event/EventProgress $event */
var_dump($event->getPercent());
});
-
failure Π΅ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ., (*23)
-
after ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ ΠΊΠΎΠ³Π΄Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ, Π½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ Π±ΡΠ»Π° Π»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ., (*24)
-
after.pass ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡ
ΠΎΠ΄Π° ΠΏΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡ
ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ. ΠΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 1 ΡΠ°Π·., (*25)
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ
ΠΠΌΠ΅ΡΡΠΎ ΠΏΡΡΠΌΠΎΠ³ΠΎ ΡΡΠ°Π½ΡΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π·Π°Π΄Π°ΡΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ. Π’Π°ΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»
Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΡΡΠΌΠΎ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠΈΡ ServiceFactoryInterface::OPTION_USE_QUEUE ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ΅ΡΠ²ΠΈΡ-ΡΠ°Π±ΡΠΈΠΊΠΈ.
Π§ΠΈΡΠ°ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ SimpleQueue., (*26)
ΠΡΠΈΠΌΠ΅Ρ, (*27)
$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., (*28)
ServiceFactory ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠΏΡΠΈΠΈ:, (*29)
-
ffmpeg.path - ΠΏΡΡΡ Π΄ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ffmpeg, (*30)
-
ffmpeg.threads - FFMpeg-ΠΎΠΏΡΠΈΡ threads. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 0., (*31)
-
ffprobe.path - ΠΏΡΡΡ Π΄ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ffprobe, (*32)
-
timeout - Π·Π°Π΄Π°ΡΡ ΡΠ°ΠΉΠΌΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ., (*33)
-
use_queue - ΠΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°Π΄Π°ΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΌ SimpleQueue\QueueAdapterInterface., (*34)
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· Π²ΠΈΠ΄Π΅ΠΎ ΡΠ°ΠΉΠ»Π°, Π°ΡΠ΄ΠΈΠΎ ΡΠ°ΠΉΠ»Π° ΠΈ Ρ.Π΄.
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-ΡΠ°ΠΉΠ»Π° ΠΈ Ρ.Π΄., (*35)
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');
ΠΠΠ-ΠΎΠ±ΡΡΡΠΊΠΈ Π½Π°Π΄ ΡΠΎΡΠΌΠ°ΡΠ°ΠΌΠΈ
Π’Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡΡΡΠΊΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Mp3 ΠΈΠ»ΠΈ Jpeg ΠΈ Ρ.Π΄.) ΡΠΎΠ·Π΄Π°Π½Ρ Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π°., (*36)
ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
ΠΡΠ΄ΠΈΠΎ-ΡΠΎΡΠΌΠ°ΡΡ
ΠΠΈΠ΄Π΅ΠΎ-ΡΠΎΡΠΌΠ°ΡΡ
Π€ΠΈΠ»ΡΡΡΡ
Π€ΠΈΠ»ΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄ΠΈΠ° ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°. ΠΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Ρ
ΠΎΠ΄ΠΎΠ² ΠΈ Π²ΡΡ
ΠΎΠ΄ΠΎΠ².
Π€ΠΈΠ»ΡΡΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² ΡΠ΅ΠΏΠΎΡΠΊΠΈ ΡΠΈΠ»ΡΡΡΠΎΠ² Π΄Π»Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΈΠ»ΡΡΡΠΎΠ² Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°., (*37)
public < ... >::addFilter(FilterInterface $filter, $priority = 0);
$filter ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠΈΠ»ΡΡΡΠ°., (*38)
$priority Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Π΄Π°ΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Π΄Π»Ρ ΡΠΈΠ»ΡΡΡΠΎΠ². ΠΠ° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠ»ΡΡΡΠ°. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 0., (*39)
ΠΡΠΈΠΌΠ΅Ρ β1, (*40)
// Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π»ΡΠ±ΠΎΠΉ ΡΠΈΠ»ΡΡΡ
$video->addFilter($filter);
// Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠΈΠ»ΡΡΡ Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ = 99.
$audio->addFilter($filter, 99);
ΠΡΠΎΡΡΠΎΠΉ ΡΠΈΠ»ΡΡΡ, SimpleFilter
ΠΡΠΎ ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΈΠ»ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ffmpeg., (*41)
use Arhitector\Transcoder\Filter\SimpleFilter;
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, (*42)
public SimpleFilter::__construct(array $parameters = [])
ΠΡΠΈΠΌΠ΅Ρ β1, (*43)
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ 'video_codec'., (*44)
//
$filter = new SimpleFilter([
'video_codec' => 'h264'
]);
ΠΡΠΈΠΌΠ΅Ρ β2, (*45)
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠ΅Ρ ΡΠ°Π½Π΅Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ., (*46)
$filter->setParameters([
'video_codec' => 'libx264'
]);
// ArrayAccess
$filter['video_codec'] = 'x264';
Π’ΠΈΠΏΡ ΡΠΈΠ»ΡΡΡΠΎΠ²
- ΠΡΠ΄ΠΈΠΎ ΡΠΈΠ»ΡΡΡΡ
Π’Π°ΠΊΠΈΠ΅ ΡΠΈΠ»ΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ AudioFilterInterface ΠΈ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Ρ Audio ΠΈΠ»ΠΈ Video., (*47)
- ΠΠΈΠ΄Π΅ΠΎ ΡΠΈΠ»ΡΡΡΡ
Π Π΅Π°Π»ΠΈΠ·ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ FrameFilterInterface ΠΈΠ»ΠΈ VideoFilterInterface, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π»ΠΈΠ±ΠΎ Ρ Frame Π»ΠΈΠ±ΠΎ Ρ Video., (*48)
Π€ΠΈΠ»ΡΡΡ Cut
ΠΡΠ΄ΠΈΠΎ ΡΠΈΠ»ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅Π·Π°ΡΡ ΠΌΠ΅Π΄ΠΈΠ°-ΡΠ°ΠΉΠ» Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ., (*49)
use Arhitector\Transcoder\Filter\Cut;
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, (*50)
public Cut::__construct(TimeInterval|int $start [, TimeInterval $duration = null])
ΠΡΠΈΠΌΠ΅Ρ β1, (*51)
ΠΡΠΎΠΏΡΡΡΠΈΡΡ 20 ΡΠ΅ΠΊΡΠ½Π΄ ΠΎΡ Π½Π°ΡΠ°Π»Π° ΠΈ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ 60 ΡΠ΅ΠΊΡΠ½Π΄., (*52)
$filter = new Cut(new TimeInterval(20), new TimeInterval(60));
Π€ΠΈΠ»ΡΡΡ Volume
ΠΡΠ΄ΠΈΠΎ ΡΠΈΠ»ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π³ΡΠΎΠΌΠΊΠΎΡΡΡ Π°ΡΠ΄ΠΈΠΎ ΠΏΠΎΡΠΎΠΊΠ°., (*53)
use \Arhitector\Transcoder\Filter\Volume;
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, (*54)
public Volume::__construct(float $volume [, string $precision = null])
ΠΡΠΈΠΌΠ΅Ρ β1, (*55)
ΠΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠ°ΠΊ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ Π³ΡΠΎΠΌΠΊΠΎΡΡΡ Π°ΡΠ΄ΠΈΠΎ., (*56)
$filter = new Volume(0.5);
$filter = new Volume(1/2);
$filter = new Volume('6.0206dB');
ΠΡΠΈΠΌΠ΅Ρ β2, (*57)
Π£Π²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠΎΡΠ½ΠΎΡΡΠΈ Π·Π²ΡΠΊΠ° Π½Π° 6 Π΄Π Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΡΡ., (*58)
$filter = new Volume('6dB', Volume::PRECISION_FIXED);
Π€ΠΈΠ»ΡΡΡ Fade
Π€ΠΈΠ»ΡΡΡ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΡΡΡΠ΅ΠΊΡ Π·Π°ΡΡΡ
Π°Π½ΠΈΡ Π·Π²ΡΠΊΠ° Π½Π° Π°ΡΠ΄ΠΈΠΎ Π΄ΠΎΡΠΎΠΆΠΊΡ., (*59)
use \Arhitector\Transcoder\Filter\Fade;
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, (*60)
public Fade::__construct(TimeInterval|int $startTime = 0 [, TimeInterval|int $duration = null [, string $effectType = null]])
ΠΡΠΈΠΌΠ΅Ρ β1, (*61)
new Fade(2, 10, Fade::FADE_OUT)
Π€ΠΈΠ»ΡΡΡ AudioDelay
use \Arhitector\Transcoder\Filter\AudioDelay;
Π€ΠΈΠ»ΡΡΡ Rotate
use \Arhitector\Transcoder\Filter\Rotate;
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, (*62)
public Rotate::__construct($angle = null)
Π€ΠΈΠ»ΡΡΡ Crop
use \Arhitector\Transcoder\Filter\Crop;
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, (*63)
public Crop::__construct(Point $start, Dimension $dimension)
ΠΠΈΡΠ΅Π½Π·ΠΈΡ
Π Π°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΠ΅ΠΉ MIT., (*64)
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.