soluble/mediatools

FFMpeg 视频音频字幕转换,缩略图,音频提取,查询...

2.2.0 2020-11-14 09:06 UTC

README

Logo

PHP 7.1+ Build Status Coverage Code Quality Latest Stable Version Total Downloads PHPStan License

为 hiphpies 提供灵活的音频/视频转换和缩略图功能。它围绕 ffmpegffprobe 包装,并暴露了它们的大部分功能,如缩放、剪辑、滤镜、转码、音频提取等等。

为了避免限制,API 更注重提供开发者细调的参数,而不是提供现成的方案。转码和转换通常需要特定的处理,请自行判断。为了帮助入门,文档中包含了很多可以轻松尝试和调整的示例和片段。还可以查看 ffmpeg 的替代包装器,它们很好,有时还能提供更多魔法,如果你在寻找它的话。

另一方面,它喜欢 PSR (psr-log, psr-container, psr-simplecache),口味是 php 7.1 在严格模式下,尽量早地失败并给出清晰的异常信息,确保当需要自定义时可以替换 (SOLID 友好)

底层,它依赖于经过实战考验的 symfony/process,它的唯一依赖。

文档

所有内容都在这里:https://soluble-io.github.io/soluble-mediatools/

要求

  • PHP 7.1+
  • FFmpeg/FFProbe 3.4+, 4.0+。

功能

请查看 文档 以获得更详细的概述!

实现的服务

VideoConverter

完整文档: 这里

<?php
use Soluble\MediaTools\Video\Config\FFMpegConfig;
use Soluble\MediaTools\Video\Exception\ConverterExceptionInterface;
use Soluble\MediaTools\Video\{VideoConverter, VideoConvertParams};

$converter = new VideoConverter(new FFMpegConfig('/path/to/ffmpeg'));

$params = (new VideoConvertParams())
    ->withVideoCodec('libx264')    
    ->withStreamable(true)
    ->withCrf(24);                  
    
try {    
    $converter->convert(
        '/path/inputFile.mov', 
        '/path/outputFile.mp4', 
        $params
    );    
} catch(ConverterExceptionInterface $e) {
    // See chapter about exception !!!    
}
       

VideoInfoReader

完整文档: 这里

<?php
use Soluble\MediaTools\Video\Config\FFProbeConfig;
use Soluble\MediaTools\Video\Exception\InfoReaderExceptionInterface;
use Soluble\MediaTools\Video\VideoInfoReader;
use Soluble\MediaTools\Video\VideoInfo;

$infoReader = new VideoInfoReader(new FFProbeConfig('/path/to/ffprobe'));

// Step 1: Read a media file

try {
    $info = $infoReader->getInfo('/path/video.mp4');
} catch (InfoReaderExceptionInterface $e) {
    // not a valid video (see exception)
}

$duration = $info->getDuration(); // total duration
$format   = $info->getFormatName(); // container format: mkv, mp4

// Step 2: Media streams info (video, subtitle, audio, data).

// Example with first video stream (streams are iterable)

try {    
    $video   = $info->getVideoStreams()->getFirst();
} catch (\Soluble\MediaTools\Video\Exception\NoStreamException $e) {
    // No video stream, 
}
    
$codec   = $video->getCodecName(); // i.e: vp9
$fps     = $video->getFps($decimals=0); // i.e: 24
$width   = $video->getWidth(); // i.e: 1080
$ratio   = $video->getAspectRatio();

// Alternate example  

if ($info->countStreams(VideoInfo::STREAM_TYPE_SUBTITLE) > 0) {
    $sub  = $info->getSubtitleStreams()->getFirst();
    $sub->getCodecName(); // webvtt
}

VideoThumbGenerator

完整文档: 这里

<?php
use Soluble\MediaTools\Video\Config\FFMpegConfig;
use Soluble\MediaTools\Video\Exception\ConverterExceptionInterface;
use Soluble\MediaTools\Video\{VideoThumbGenerator, VideoThumbParams, SeekTime};

$generator = new VideoThumbGenerator(new FFMpegConfig('/path/to/ffmpeg'));

$params = (new VideoThumbParams())
    ->withTime(1.25);
    
try {    
    $generator->makeThumbnail(
        '/path/inputFile.mov', 
        '/path/outputFile.jpg', 
        $params
    );    
} catch(ConverterExceptionInterface $e) {
    // See chapter about exception !!!    
}
       

VideoAnalyzer

完整文档: 这里

<?php
use Soluble\MediaTools\Video\Config\FFMpegConfig;
use Soluble\MediaTools\Video\Exception\AnalyzerExceptionInterface;
use Soluble\MediaTools\Video\VideoAnalyzer;

$analyzer = new VideoAnalyzer(new FFMpegConfig('/path/to/ffmpeg'));

try {    
    $interlaceGuess = $analyzer->detectInterlacement(
        '/path/input.mov',
        // Optional:
        //   $maxFramesToAnalyze, default: 1000
        $maxFramesToAnalyze = 200
    );
    
} catch(AnalyzerExceptionInterface $e) {
    // See chapter about exception !!!    
}

$interlaced = $interlaceGuess->isInterlaced(
    // Optional: 
    //  $threshold, default 0.25 (if >=25% interlaced frames, then true) 
    0.25
);

替代方案

编码规范和互操作性