Giter VIP home page Giter VIP logo

transcoder's Introduction

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

Установка

$ composer require arhitector/transcoder dev-master

1. Быстрый старт

Необходимо определить, с каким типом файлов предстоит работать.

Arhitector\Transcoder\Audio используется для работы с аудио-файлами.

Arhitector\Transcoder\Video используется для работы с видео-файлами.

Arhitector\Transcoder\Frame используется для работы с изображениями.

Arhitector\Transcoder\Subtitle используется для работы с субтитрами.

Конструктор в общем виде выглядит так

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

$filePath - определяет путь до исходного файла. Вы не можете использовать удаленный источник или символические ссылки.

$service - не обязательный параметр, экземпляр сервиса. Если не передан, то будет использоваться ServiceFactory.

1.1. Примеры

Простые примеры

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');

Вы можете использовать свою сервис-фабрику или изменить некоторые опции.

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

// используем это
$video = new Video('sample.avi', $service);

1.2. Что можно настроить?

ServiceFactory поддерживает следующие опции:

  • ffmpeg.path - путь до исполняемого файла ffmpeg

  • ffmpeg.threads - FFMpeg-опция threads. По умолчанию 0.

  • ffprobe.path - путь до исполняемого файла ffprobe

  • timeout - задаёт таймаут выполнения команды кодирования.

  • use_queue - задача кодирования будет отправляться в очередь. Значение должно быть объектом, реализующим SimpleQueue\QueueAdapterInterface.

Вы можете использовать свою реализацию сервис-фабрики. Для этого необходимо реализовать в вашем объекте интерфейс Arhitector\Transcoder\Service\ServiceFactoryInterface.

2. Поддержка очередей

Вместо прямого транскодирования вы можете отправлять задачи в очередь, например, на сервер очередей. Такой функционал доступен прямо из коробки. Вы можете использовать опцию ServiceFactoryInterface::OPTION_USE_QUEUE при создании сервис-фабрики.

Пример

$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()); // запросить задачу из очереди

Извлечение информации из видео файла, аудио файла и т.д.

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-файла и т.д.

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 и т.д.) созданы для удобства.

Изображения

  • Png, Jpeg, Ppm, Bmp, Gif

Фильтры

Аудио фильтры

  • Фильтр Volume

Фильтр изменяет громкость аудио потока.

use \Arhitector\Jumper\Filter\Volume;

Пример показывает как уменьшить громкость аудио.

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

Increase input audio power by 6 decibels using fixed-point precision.

$filter = new Volume('6dB', Volume::PRECISION_FIXED);
  • Фильтр Fade

Фильтр накладывает эффект затухания звука.

use \Arhitector\Jumper\Filter\Fade;

Опции форматов

FormatInterface определяет

duration

extensions

metadata

FrameFormatInterface дополняет список FormatInterface

video_codec

width

height

available_video_codecs

AudioFormatInterface дополняет список FrameFormatInterface

channels

audio_codec

audio_bitrate

frequency

available_audio_codecs

VideoFormatInterface дополняет список AudioFormatInterface

video_bitrate

passes

frame_rate

transcoder's People

Watchers

Nikolya avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.