arhitector / transcoder

音频或视频转码/编码工具,检查和转换媒体格式

dev-master / 1.0.x-dev 2018-10-12 12:59 UTC

This package is auto-updated.

Last update: 2024-08-29 03:42:08 UTC


README

音频或视频转码/编码工具,检查和转换媒体格式。

用于音频或视频编码,获取信息以及转换到其他格式的工具。

内容

从哪里开始

根据内容,您可以使用 Audio 来处理音频文件,Frame 来处理图像,而 VideoSubtitle 分别用于视频文件和字幕。

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

构造函数的一般形式如下

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

$filePath - 字符串,到原始文件的路径。

您不能使用远程源或符号链接。

$service - 参数不是必需的。服务实例。默认为 ServiceFactory

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

您可以使用自己的服务工厂或更改一些选项。

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

事件

格式实例注册处理程序,该处理程序将在特定事件发生时执行。方法 addListeneraddOneListener 在事件上注册处理程序。阅读更多 League\Event

$format = new VideoFormat();
$format->addListener('*', function ($event) {
	// "*" - обработчик сработает на любое событие
});

根据事件,处理程序可以影响操作的进一步执行。

$format->addListener('before', function ($event) {
	$event->stopPropagation(); // дальнейшее выполнение будет остановлено
});

事件 before

在编码开始前执行。后续执行可能被停止。

$format->addListener('before', function ($event, $media, $format, $filePath) {
	// обработчик сработает после вызова `$media->save($format, ...`
});

事件 before.pass

在多遍编码中,处理程序将在每次遍历之前被调用。事件至少触发一次。

事件在 before 之后触发,不能取消编码过程。

use Symfony\Component\Process\Process;

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

事件 before.queue

事件 successful

事件发生在编码无错误完成的情况下。如果使用队列 - 当任务添加到队列时。

$format->addListener('successful', function ($event, $media, $format, $filePath) {
	// работа завершена без ошибок
});

事件 failure

操作因错误而完成或无法正确完成。

use Symfony\Component\Process\Exception\ProcessFailedException;

$format->addListener('failure', function ($event, ProcessFailedException $exception) {
	// кодирование не может быть завершено из-за возникшей ошибки
});

事件 failure.codec

事件 after

处理程序将在操作完成后被调用,无论操作是否成功完成。

$format->addListener('after', function ($event, $media, $format, $filePath) {
	// операция завершилась, но мы не знаем успешно или нет
});

事件 after.pass

在多遍编码完成后触发。至少调用一次。

use Symfony\Component\Process\Process;

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

事件 after.queue

事件 progress

事件在编码操作执行时发生。

use Arhitector/Transcoder/Event/EventProgress;

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

事件 stream

队列支持

您可以将任务发送到队列,例如,到队列服务器。这种功能直接内置。您可以在创建服务工厂时使用 ServiceFactoryInterface::OPTION_USE_QUEUE 选项。阅读更多 SimpleQueue

示例

$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

ServiceFactory 支持以下选项

  1. ffmpeg.path - ffmpeg 可执行文件的路径

  2. ffmpeg.threads - FFMpeg 的线程选项。默认 0

  3. ffprobe.path - ffprobe 可执行文件的路径

  4. timeout - 设置编码命令的超时时间。

  5. use_queue - 将任务发送到队列。值应该是实现 SimpleQueue\QueueAdapterInterface 的对象。

示例

从视频文件、音频文件等提取信息。

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

文本叠加

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等)是为了方便而设计的。

图像

  • Png, Jpeg, Ppm, Bmp, Gif

音频格式

  • Aac, Mp3, Oga, Flac

视频格式

  • Flv, Mkv

过滤器

过滤器用于更改原始媒体内容。它们可以有一个或多个输入和输出,并且可以组织成链以隔离某些过滤器。

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

音频过滤器实现AudioFilterInterface接口,并且只能与AudioVideo一起使用。

视频过滤器实现FrameFilterInterfaceVideoFilterInterface接口,可以与FrameVideo一起使用。

// добавляем любой фильтр
$video->addFilter($filter);

// добавляем фильтр с приоритетом = 99.
$audio->addFilter($filter, 99);

简单过滤器,SimpleFilter

这是最简单的过滤器,允许为ffmpeg命令行设置自己的参数。

use Arhitector\Transcoder\Filter\SimpleFilter;

构造函数

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

创建一个实例并添加参数'video_codec'。

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

此方法将重写之前设置的值。

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

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

剪切过滤器 Cut

音频过滤器,允许将媒体文件剪切到特定的持续时间值。

use Arhitector\Transcoder\Filter\Cut;

构造函数

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

示例 #1

跳过前20秒并保存接下来的60秒。

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

音量过滤器 Volume

音频过滤器,用于更改音频流的音量。

use \Arhitector\Transcoder\Filter\Volume;

构造函数

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

示例 #1

示例展示了如何降低音频音量。

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

示例 #2

以固定的精度将输入音量增加6分贝。

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

淡入/淡出过滤器 Fade

淡入/淡出过滤器在音频轨道上应用声音淡入/淡出效果。

use \Arhitector\Transcoder\Filter\Fade;

构造函数

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

示例 #1

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

音频延迟过滤器 AudioDelay

use \Arhitector\Transcoder\Filter\AudioDelay;

旋转过滤器 Rotate

use \Arhitector\Transcoder\Filter\Rotate;

构造函数

public Rotate::__construct($angle = null)

剪切过滤器 Crop

use \Arhitector\Transcoder\Filter\Crop;

构造函数

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

许可证

在MIT许可证下分发。MIT.

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.