我一直在尝试创建一个Python应用程序,它接受一个mp4文件、一个mp3文件和一个字幕字典来生成一个输出mp4文件。
我让它工作得很好,但我发现
libx264
编解码器在调用 write_videofile()
时非常慢,尤其是对于 CompositeVideoClip
对象。我想使用 GPU 来加速编码过程,因此在进行了大量研究后,我做了以下工作:
ffmpeg -codecs
验证了这一点)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 加速一起工作,我更喜欢这样做。如有任何帮助,我们将不胜感激。
moviepy 输出的视频流具有
High 4:4:4 Predictive
配置文件。这并没有得到玩家的广泛支持。应添加命令行选项 -pix_fmt yuv420p
。