FFMPEG 快速质量视频编码,无质量损失且存储占用更少(可能使用 GPU)

问题描述 投票:0回答:1

我写了一个go代码,但是速度很慢,视频压缩率也不是那么令人印象深刻。我是 FFMPEG 的新手,我的整个项目都依赖于 FFMPEG。我尝试过不同的视频编解码器,例如 vp9、h264、h265、NVENC、AV1 等。所有这些都太慢了(也许我还不够好来优化它)。我的项目基于 Go,当前使用的编解码器是 libx264。谁能帮我优化项目的视频编码部分。

Libx264:

func encodeVideo(fileName, bitrate, crf, preset, resolution string) *exec.Cmd {
    return exec.Command("C:\\ffmpeg-6.1-full_build\\bin\\ffmpeg",
        "-i", "./userUploadDatas/videos/"+fileName,
        "-c:v", "libx264",
        "-b:v", bitrate,
        "-crf", crf,
        "-preset", preset,
        "-vf", "scale="+resolution,
        "./userUploadDatas/videos/"+fileName+"_encoded"+".mp4")
}

请提供每个参数的静态值。任何编解码器都可以为我工作,只要它速度快、占用空间少且不丢失空间。

我在使用不同编解码器时遇到的问题是:

  1. NVENC:速度快,但视频大小加倍且视频质量下降。
  2. libx264:我目前能找到的最好的,但速度很慢。
  3. h264、h265:占用更多空间
  4. Av1 & vp9:速度太慢,无法在 1 小时内编码 30 秒的视频。

我使用的硬件规格是Ryzen7 5000系列CPU,NVIDIA RTX 3050 Ti笔记本电脑GPU。

performance optimization video ffmpeg encoding
1个回答
0
投票

视频在保持质量的同时可以压缩多少,很大程度上取决于目标视频的压缩、编解码器、像素格式等。您可以根据视频质量指标测量比特率,以确定转码后的视频是否满足您的期望。

  • 为了测量视频的感知质量,您可以使用 Netflix 的 VMAF,它也支持 PSNR 和 SSIM,并且可通过 libvmaf 库用于 ffmpeg(也可以使用 CUDA 实现)。
  • 根据我的经验,95%及以上的VMAF分数是感知上无损

作为示例,您可以在 graph 中看到关系的展示:使用 av1_nvenc 将 H.264、YUV420、8 位视频转码为 AV1 的比特率与质量。使用的脚本是:

for cq in {0..50}; do ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i xyz.mkv -c:a copy -c:v av1_nvenc -preset p7 -tune hq -cq:v $cq -rc-lookahead 53 xyz.cq${cq}.mp4; done
  • 始终定义一个目标质量级别(在这种情况下
    -cq
    ,我个人对此脚本的偏好是30),否则结果是不可预测的
  • 如果您想保持质量,请使用高质量预设
  • 您还可以将
    -qmin
    -qmax
    设置为与
    -cq
    相同的值,但文件可能会变大,但对质量几乎没有好处
  • 有些视频会被很好地压缩为较小的文件大小,有些会变得比原始视频更大,猜测不起作用,所以最好运行转码器并查看结果。
  • H.264、H.265 和 AV1 都有 ffmpeg 的软件和硬件实现/集成,并且硬件转码器始终比其软件转码器更快。
© www.soinside.com 2019 - 2024. All rights reserved.