aleksandr-kuporosov / transcoder
音频或视频转码/编码工具,检查和转换媒体格式。
Requires
- php: >=5.6
- fguillot/simple-queue: ^1.0
- league/event: ^2.1
- ralouphie/mimey: ^1.0
- symfony/process: ^3.2
Requires (Dev)
- phpunit/phpunit: 5.*
This package is not auto-updated.
Last update: 2024-09-20 20:26:23 UTC
README
音频或视频转码/编码工具,检查和转换媒体格式。
音频和视频的编码、转换和元信息提取工具。
要求
- PHP 5.6或更高版本
- 已安装FFMpeg
安装
支持使用Composer包管理器安装。
$ composer require arhitector/transcoder dev-master
您也可以自己将依赖关系添加到现有的composer.json
文件中。
{ "require": { "arhitector/transcoder": "dev-master" } }
提供帮助
发现了错误或有新功能想法?请提交新问题。
从哪里开始
根据内容,您可以使用Audio
处理音频文件,Frame
处理图像,而Video
和Subtitle
分别处理视频文件和字幕。
构造器通常如下所示
public < ... >::__construct(string $filePath, ServiceFactoryInterface $service = null)
$filePath
- 字符串,源文件的路径。
您不能使用远程源或符号链接。
$service
- 可选参数。服务实例。默认为ServiceFactory
。
示例 #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');
示例 #2
您可以使用自己的服务工厂或更改一些选项。
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。
示例 #1
添加事件处理器。
$format = new VideoFormat(); $format->addListener('*', function ($event) { // обработчик сработает на любое событие });
支持的事件
before
在编码开始前执行。您可以通过调用$event->stopPropagation()
来取消过程。
示例 #2
操作将被取消,并且不会调用后续事件。
$format = new AudioFormat(); $format->addListener('before', function ($event) { $event->stopPropagation(); });
-
before.pass
事件在多遍编码前每次遍历都会被调用。至少会调用一次。 -
success
在操作成功时触发。 -
progress
在操作执行过程中触发。
示例 #3
$format = new VideoFormat(); $format->addListener('progress', function ($event) { /* @var Arhitector/Transcoder/Event/EventProgress $event */ var_dump($event->getPercent()); });
-
failure
如果发生错误。 -
after
处理程序在操作完成后被调用,无论操作是否成功。 -
after.pass
在多遍编码完成遍历后触发。至少会调用一次。
队列支持
您可以将任务发送到队列,例如,到队列服务器。此功能直接内置。您可以在创建服务工厂时使用选项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');
格式对象的面向对象包装
这类封装(例如,MP3 或 JPEG 等)是为了方便而创建的。
图像
- Png, Jpeg, Ppm, Bmp, Gif
音频格式
- Aac, Mp3, Oga, Flac
视频格式
- Flv, Mkv
过滤器
过滤器用于修改原始媒体内容。它们可能有一个或多个输入和输出。过滤器可以组织成过滤器链,以隔离某些过滤器。
public < ... >::addFilter(FilterInterface $filter, $priority = 0);
$filter
过滤器实例。
$priority
您可以为过滤器设置优先级。根据优先级确定过滤器使用的顺序。默认值为 0
。
示例 #1
// добавляем любой фильтр $video->addFilter($filter); // добавляем фильтр с приоритетом = 99. $audio->addFilter($filter, 99);
简单过滤器,SimpleFilter
这是最简单的过滤器,它允许您为 ffmpeg 的命令行设置参数。
use Arhitector\Transcoder\Filter\SimpleFilter;
构造函数
public SimpleFilter::__construct(array $parameters = [])
示例 #1
创建一个实例并添加参数 'video_codec'。
// $filter = new SimpleFilter([ 'video_codec' => 'h264' ]);
示例 #2
此方法将覆盖之前设置的值。
$filter->setParameters([ 'video_codec' => 'libx264' ]); // ArrayAccess $filter['video_codec'] = 'x264';
过滤器类型
- 音频过滤器
这些过滤器实现 AudioFilterInterface
接口,并且只能与 Audio
或 Video
一起使用。
- 视频过滤器
实现 FrameFilterInterface
或 VideoFilterInterface
接口,与 Frame
或 Video
一起使用。
裁剪过滤器
音频过滤器,允许将媒体文件裁剪到特定的时间长度。
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 许可证下分发: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.