有没有办法可以加快FFmpeg的处理速度?

8

我在处理过程中遇到了问题。我使用一个实际的联合服务器在$10数字托管套餐中,并使用来自Amazon S3的云服务。问题是在上传视频时,无论视频大小是1兆字节还是2吉字节,上传完成后,处理过程开始上传,没有问题。但是当处理过程需要很长时间以至于我无法完成它时,有什么解决办法,这是我的问题还是这个过程正常?我使用laravel-ffmpeg并通过laravel队列将视频剪切成多种质量,我会将代码附上。

public function handle()
{
    //180p
    $lowBitrate1 = (new X264('aac'))->setKiloBitrate(613);
    //270p
    $lowBitrate2 = (new X264('aac'))->setKiloBitrate(906);
    //360p
    $midBitrate1 = (new X264('aac'))->setKiloBitrate(1687);
    //540p
    $midBitrate2 = (new X264('aac'))->setKiloBitrate(2227);
    //720p
    $highBitrate1 = (new X264('aac'))->setKiloBitrate(4300);
    //1080
    $highBitrate2 = (new X264('aac'))->setKiloBitrate(7917);

FFMpeg::fromDisk('s3')
    ->open($this->movie->path)
    ->exportForHLS()
    ->onProgress(function ($percent) {
        $this->movie->update([
            'percent' => $percent
        ]);
    })
    ->setSegmentLength(10)// optional
    ->addFormat($lowBitrate1)
    ->addFormat($lowBitrate2)
    ->addFormat($midBitrate1)
    ->addFormat($midBitrate2)
    ->addFormat($highBitrate1)
    ->addFormat($highBitrate2)
    ->toDisk('s3')
    ->save("public/Movies/{$this->movie->id}/{$this->movie->id}.m3u8");
}//end of handle

4
欢迎来到Stack Overflow!您的代码是以图片形式呈现的,这意味着未来有相同问题的人将无法搜索到。请阅读此指南,了解如何提供高质量问题所需的代码,并在问题中包含并标记您的代码。谢谢! - Joundill
1个回答

17

你不能做太多事情。x264已经高度优化了。除了升级云服务,以下是一些小建议:

  • 提供更少的比特率层。你真的需要6个吗?

  • 确保x264正在使用CPU的功能。参考ffmpeg日志并查找 using cpu capabilities 行。如果它显示为 none,那么你可能会错过一些速度。重新编译x264和ffmpeg 不要使用--disable-asm

  • 使用更快的x264编码预设

  • 确保你的ffmpeg和所链接的x264不是非常老旧的版本。

  • 流拷贝音频而不是重新编码它,如果输入音频格式与你的输出兼容。

  • 如果要编码音频,并且每个输出都是相同的,请使用tee muxer仅对其进行一次编码,并将其传递到每个输出,而无需为每个输出不必要地编码相同的音频。

  • 尝试使用硬件加速编码器,例如h264_nvenc,如果它被您的环境和ffmpeg构建所支持。它可能更快,但每比特提供的质量不如x264。请注意,一些显卡可能有人为限制同时编码的流数量(尽管如果我记得正确的话,有一些解决方法)。


  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接