首页 > 编程问答 >nvenc 用于 ffmpeg 硬件加速,使用 moviepy 生成损坏的 mp4

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

时间:2024-07-23 11:44:23浏览次数:7  
标签:python video ffmpeg moviepy nvenc

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

我让它工作得很好,但我发现 libx264 编解码器调用 write_videofile() 时会非常慢,尤其是使用 CompositeVideoClip 对象时。我想使用我的 GPU 来加速编码过程,因此在做了大量研究后,我做了以下操作:

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

验证了这一点 write_videofile() 我正在使用Windows 10并且 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 from FFMPEG_BINARY 来更改

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

我阅读了 ffmpeg 和 moviepy 的文档,但我找不到我的代码的问题。我还使用以下命令在 PowerShell 中直接使用 ffmpeg 进行了测试,效果很好:

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]

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


很高兴提供帮助!看来在使用 h264_nvenc 编解码器和 MoviePy 时遇到了问题,导致生成损坏的 MP4 文件。做的测试和研究表明问题可能与 MoviePy 与 NVENC 的特定交互方式有关,而不是与的 FFmpeg 设置有关。

让我们来解决这个问题。以下是一些需要检查和尝试的调试步骤:

1. 验证像素格式:

  • NVENC 编码器通常需要 YUV444p YUV420p 像素格式的输入。确认 MoviePy 传递给 FFmpeg 的视频帧符合这些格式。
  • 可以在 FFmpeg 命令中添加 -pix_fmt yuv420p 来强制进行像素格式转换。这可以通过 ffmpeg_params 在 MoviePy 中完成。

2. 调整比特率和预设:

  • 尝试了不同的 ffmpeg_params ,但这值得再次尝试。较低的比特率或更快的预设可能会导致 NVENC 出现问题,尤其是在较旧的 GPU 上。
  • 尝试增加比特率 ( -b:v ) 并使用更慢的预设(例如 -preset medium -preset slow )。

3. 更新 MoviePy:

  • 确保使用的是最新版本的 MoviePy。有时,旧版本可能存在与硬件加速相关的兼容性问题。
  • 可以使用 pip install --upgrade moviepy 更新 MoviePy。

4. 测试简化示例:

  • 为了隔离问题,尝试使用 h264_nvenc 编解码器和 MoviePy 创建一个非常简单的视频(例如,具有纯色背景和一些文本)。如果此操作有效,则问题可能在于主项目中更复杂的视频合成。

5. 检查 GPU 驱动程序和 CUDA 版本:

  • 虽然已经更新了驱动程序,但有时较新的驱动程序版本可能引入新的问题。尝试安装较旧但稳定的驱动程序版本,看看是否能解决问题。
  • 此外,请确保的 CUDA 版本与的 GPU 和 FFmpeg 版本兼容。

示例代码(使用像素格式转换):

import os
from moviepy.editor import *

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

# ... your video creation code ...

if GPU_ACCELERATION:
    print("使用 GPU 加速视频写入")
    video.write_videofile(
        output_path,
        codec='h264_nvenc',
        audio_codec='aac',
        ffmpeg_params=['-pix_fmt', 'yuv420p', '-b:v', '5M', '-preset', 'medium'],  # 添加像素格式和比特率
        verbose=True
    )
else:
    # ... your existing CPU encoding code ...

如果在尝试了这些步骤后问题仍然存在,请提供以下附加信息,以便我进一步帮助:

  • 的 GPU 型号
  • 正在使用的 MoviePy、FFmpeg 和 CUDA 驱动程序的确切版本
  • FFmpeg 命令的完整输出(包含在 verbose=True 中)
  • 如果可能,请提供一个小的代码示例,以便重现该问题。

祝编码顺利!

标签:python,video,ffmpeg,moviepy,nvenc
From: 78781458

相关文章

  • 使用 Python 通过逻辑应用运行长时间运行的 Azure Functions
    我已经尝试解决这个问题有一段时间了,但我似乎找不到解决方案。因此,正如标题所示,我试图通过函数在逻辑应用程序中运行长时间运行的操作。我有一个python代码,可以比较2个excel文件并进行一些转换。它工作正常,但是,Excel文件包含近20k行(它是动态的,将来会添加更多行),因此......
  • 使用递归函数计算阶乘时,我在 python 中遇到类型错误
    defcalc_fact(n):如果(n==1或n==0):返回1别的:n*calc_fact(n-1)print(calc_fact(5))试图创建函数来计算阶乘,不支持类型错误操作数*:对于int或Nonetype我不知道为什么谢谢Python代码中出现“类型错误:不支持的操作数类型为*:'int'和'NoneType'”表明你......
  • 如何调试 python Flask [84] [CRITICAL] WORKER TIMEOUT?
    调试:gtts.tts:保存到temp.mp37月22日09:10:56PM[2024-07-2215:40:56+0000][84][严重]工作超时(pid:87)|||7月22日09:10:56PM[2024-07-2215:40:56+0000][87][INFO]工人退出(pid:87)7月22日09:10:57PM[2024-07-2215:40:57+0000][95][INF......
  • 类型错误:无法将函数返回值转换为 Python 类型!签名是 () -> 处理 anaconda spider
    这是代码:importosimportrandomimportnumpyasnpimportpandasaspdimporttensorflowastffromtensorflow.kerasimportbackendasKfromtensorflow.keras.layersimportDense,Dropout,Flatten,Conv2D,MaxPool2D,Input......
  • python进阶---闭包与装饰器
    一、闭包        在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。    闭包的三要素:    1、外部函数嵌套内部函数    2、外部函数返......
  • FFmpeg 常用功能
    1.无损快速分割视频1.1:从01:45秒开始截取,一直到结束。备注:这个执行过程非常快。cdC:\MyFiles\FFmpeg\ffmpeg-v2022-03-09\ffmpeg\binffmpeg-i"D:\周星驰《功夫》.mp4"-ss00:01:45-codeccopy"D:\周星驰《功夫》_裁剪后.mp4"  1.1:从01:45秒开始截取,持续一分......
  • 强制从当前包自动导入的 Python 以此包的名称为前缀
    我在VSCode中使用Python和Pylance扩展。在我正在编辑的自己的包中,自动添加的导入(设置“导入格式:绝对”)如下所示:frommydirectory.myfileimportmyclass但是,我的Python包正在被被一个(非常愚蠢且不可协商的)外部系统消耗,该系统拒绝正确解释它,除非导入的格式特别......
  • Python语言-面向对象
    知识代码classJobSalary(object):job=''def__init__(self,city):self.jobname="数据分析师"self.exp=''self.city=city#方法defdata_normalize(self,data):print(f'正在规范化......
  • 需要帮助使用 Selenium Python 单击 Microsoft Teams 按钮
    我将Python与Selenium结合使用,并自动登录MicrosoftTeams。进入后,弹出窗口显示我需要单击“立即切换”以切换到V2版本。我似乎无法使用SeleniumPython成功单击此按钮。谁能帮我自动点击这个按钮?这是我不成功的尝试:self.driver.find_element(By.CLASS_NAME,......
  • python接口自动化(四十)- logger 日志 - 下(超详解)
    宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类。可能有的小伙伴在这里会有个疑问一个logging为什么分两篇的篇幅......