arhitector / jumper
音频或视频转码/编码工具,检查和转换媒体格式
Requires
- php: >=5.6
- league/event: ^2.1
- ralouphie/mimey: ^1.0
- symfony/process: ^3.2
Requires (Dev)
- phpunit/phpunit: 5.*
This package is auto-updated.
Last update: 2024-08-29 04:37:06 UTC
README
音频或视频转码/编码工具,检查和转换媒体格式。
用于编码音频或视频、获取信息并转换为其他格式的工具。
内容
从哪里开始
根据内容,您可以使用 Audio
来处理音频文件,Frame
来处理图像,而 Video
和 Subtitle
分别用于处理视频文件和字幕。
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
事件
格式实例注册处理程序,该处理程序将在特定事件发生时执行。使用 addListener
或 addOneListener
方法注册处理程序。了解更多信息 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
支持以下选项
-
ffmpeg.path
- ffmpeg 可执行文件的路径 -
ffmpeg.threads
- FFMpeg 的线程选项。默认0
。 -
ffprobe.path
- ffprobe 可执行文件的路径 -
timeout
- 设置编码命令执行的超时时间。 -
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
接口,并且只能与 Audio
或 Video
一起使用。
视频过滤器实现 FrameFilterInterface
或 VideoFilterInterface
接口,可以与 Frame
或 Video
一起使用。
// добавляем любой фильтр $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';
裁剪过滤器
音频过滤器,允许将媒体文件裁剪到特定的持续时间。
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));
音量过滤器
音频过滤器,可以改变音频流的音量。
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 dB。
$filter = new Volume('6dB', Volume::PRECISION_FIXED);
淡入/淡出过滤器
音频过滤器,将淡入/淡出效果应用于音频轨道。
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)
音频延迟过滤器
use \Arhitector\Transcoder\Filter\AudioDelay;
旋转过滤器
use \Arhitector\Transcoder\Filter\Rotate;
构造函数
public Rotate::__construct($angle = null)
裁剪过滤器
use \Arhitector\Transcoder\Filter\Crop;
构造函数
public Crop::__construct(Point $start, Dimension $dimension)
许可证
遵循 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.