Laravel集成ffmpeg 多码率m3u8格式转换 使用GPU转码

沈飞翼
2023-12-01

一、安装ffmpeg

#快速安装的脚本
wget https://raw.githubusercontent.com/q3aql/ffmpeg-install/master/ffmpeg-install
chmod a+x ffmpeg-install
./ffmpeg-install --install release

二、安装laravel-ffmpeg

1. 执行composer命令

composer require pbmedia/laravel-ffmpeg

2. 修改config/app.php添加配置

'providers' => [
    Pbmedia\LaravelFFMpeg\FFMpegServiceProvider::class
];

'aliases' => [
    'FFMpeg' => Pbmedia\LaravelFFMpeg\FFMpeg::class
];

3. 执行命令发布配置

php artisan vendor:publish --provider="ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider"

4. 添加.env配置

FFMPEG_BINARIES=/usr/bin/ffmpeg
FFPROBE_BINARIES=/usr/bin/ffprobe

三、Laravel中转码生成m3u8格式文件(什么是M3u8格式

1. 单码率m3u8

public function handle()
{
    $format = new FFMpeg\Format\Video\X264('aac', 'libx264');

    FFMpeg::fromDisk('public')
        ->open('video.mp4')
        ->exportForHLS()
        ->toDisk('public')
        ->addFormat($format)
        ->save('video.m3u8');
}

2. 多码率m3u8

public function handle()
{
    $lowBitrate = (new FFMpeg\Format\Video\X264('aac', 'libx264'))->setKiloBitrate(250);
    $midBitrate = (new FFMpeg\Format\Video\X264('aac', 'libx264'))->setKiloBitrate(500);
    $highBitrate = (new FFMpeg\Format\Video\X264('aac', 'libx264'))->setKiloBitrate(1000);

    FFMpeg::fromDisk('public')
        ->open('video.mp4')
        ->exportForHLS()
        ->toDisk('public')
        ->addFormat($lowBitrate)
        ->addFormat($midBitrate)
        ->addFormat($highBitrate)
        ->save('video.m3u8');
}

四、使用GPU转码

1. 使用laravel-ffmpegV7版本

需要Laravel 6.0以上的版本,我用的5.8,再加上作者暂时没有测试过,所以没有试用这个方案。

composer require "pbmedia/laravel-ffmpeg:v7.x-dev"
$format = new \FFMpeg\Format\Video\X264('libfaac', 'h264_cuvid');
$format->setInitialParameters(['-vsync', 0, '-hwaccel', 'cuvid']);

FFMpeg::fromDisk('videos')
    ->open('steve_howe.mp4')
    ->export()
    ->toDisk('converted_videos')
    ->inFormat($format)
    ->save('small_steve.mkv');

2. 重写类,亲测有效(如何重写

  1. 重写src/FFMpeg/Format/Video/X264.php文件
/**
 * {@inheritDoc}
 */
public function getAvailableVideoCodecs()
{
    return array('libx264', 'h264_cuvid'); //增加h264_cuvid
}
  1. 重写src/FFMpeg/Media/AbstractVideo.php文件

php-ffmpeg 0.15版本以下,修改代码增加commads的参数

    /**
     * Return base part of command.
     *
     * @return array
     */
    protected function basePartOfCommand(){
    	if (evc('GPU_NVIDIA_SWITCH')) {//是否使用GPU转码
            $commands = array('-y', '-vsync', 0, '-hwaccel', 'cuvid');
        } else {
            $commands = array('-y', '-i', $this->pathfile);
        }
        return $commands;
    }

php-ffmpeg 0.15版本以上不需要修改直接使用setInitialParameters方法

$format->setInitialParameters(['-vsync', 0, '-hwaccel', 'cuvid']);

下面是相关代码

    /**
     * Return base part of command.
     *
     * @param FormatInterface $format
     * @return array
     */
    protected function basePartOfCommand(FormatInterface $format)
    {
        $commands = array('-y');

        // If the user passed some initial parameters
        if ($format instanceof VideoInterface) {
            if (null !== $format->getInitialParameters()) {
                foreach ($format->getInitialParameters() as $initialParameter) {
                    $commands[] = $initialParameter;
                }
            }
        }

        $commands[] = '-i';
        $commands[] = $this->pathfile;

        return $commands;
    }
 类似资料: