nvenc 用于 ffmpeg 硬件加速,并使用 moviepy 生成损坏的 mp4

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

我一直在尝试创建一个Python应用程序,它接受一个mp4文件、一个mp3文件和一个字幕字典来生成一个输出mp4文件。

我让它工作得很好,但我发现

libx264
编解码器在调用
write_videofile()
时非常慢,尤其是对于
CompositeVideoClip
对象。我想使用 GPU 来加速编码过程,因此在进行了大量研究后,我做了以下工作:

  • 为我的 1080 Ti 安装 CUDA 12.5 并更新驱动程序
  • 安装 Gyan 的 ffmpeg 版本,该版本已经具有 nvenc 支持(使用
    ffmpeg -codecs
    验证了这一点)
  • 将我的 Python 代码中的
    FFMPEG_BINARY
    设置为我的 PATH 上的内容

我正在使用 Windows 10 和

write_videofile()
,即使在更改
libx264
后,也可以与
FFMPEG_BINARY
编解码器配合使用。但是,当我设置
codec='h264_nvenc'
时,即使
moviepy
成功完成,生成的 mp4 文件似乎已损坏。 全黑了,玩不了。

这是我的代码:

GPU_ACCELERATION = True
if GPU_ACCELERATION:
    os.environ["FFMPEG_BINARY"] = FFMPEG_BINARY

...

# save the file
if GPU_ACCELERATION:
    print("using GPU to accelerate video write")
    video.write_videofile(output_path,
                        codec='h264_nvenc',  # use NVENC for encoding
                        audio_codec='aac',
                        verbose=True)
else:
    print("no GPU acceleration. expect longer times.")
    video.write_videofile(output_path, 
                            codec='libx264',
                            audio_codec='aac',
                            preset='fast',
                            ffmpeg_params=['-crf', '18'])

我花了很长时间在

ffmpeg_params
中传递不同的值但无济于事。我还尝试使用
change_settings()
中的
moviepy.config
来更改
FFMPEG_BINARY
。我阅读了 ffmpeg 和 moviepy 的文档,但我找不到我的代码的问题。我还使用以下命令直接在 PowerShell 中使用 ffmpeg 进行了测试,效果很好:

ffmpeg -i input.mp4 -c:v h264_nvenc -preset fast -b:v 1M -c:a aac output.mp4

我还在损坏的输出 mp4 上运行了 ffprobe,但从元数据中看不到任何问题:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\path\to\final.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf61.1.100
  Duration: 00:00:59.50, start: 0.000000, bitrate: 4011 kb/s
  Stream #0:0[0x1](und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), gbrp(pc, gbr/unknown/unknown, progressive), 606x1080 [SAR 1:1 DAR 101:180], 3870 kb/s, 60 fps, 60 tbr, 15360 tbn (default)
      Metadata:
        handler_name    : VideoHandler
        vendor_id       : [0][0][0][0]
        encoder         : Lavc61.3.100 h264_nvenc
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
      Metadata:
        handler_name    : SoundHandler
        vendor_id       : [0][0][0][0]

我正在考虑使用 PowerShell 脚本直接使用 ffmpeg 进行视频处理,但如果我能以某种方式让我的 Python 代码与 GPU 加速一起工作,我更喜欢这样做。如有任何帮助,我们将不胜感激。

python video ffmpeg moviepy nvenc
1个回答
0
投票

moviepy 输出的视频流具有

High 4:4:4 Predictive
配置文件。这并没有得到玩家的广泛支持。应添加命令行选项
-pix_fmt yuv420p

© www.soinside.com 2019 - 2024. All rights reserved.