Moviepy 无法读取文件的持续时间

2023-11-27

我一直在使用 Moviepy 将几个较短的视频文件合并为一个小时长的文件。一些小文件被“损坏”,它们包含视频但未正确完成(即它们使用 VLC 播放,但没有持续时间,并且您无法在视频中跳过)。

当我尝试使用 VideoFileClip(file) 函数创建剪辑时,我注意到这个问题。出现的错误是:

MoviePy 错误:无法读取文件的持续时间

有没有办法仍然从该视频文件中读取“好”帧,然后将它们添加到较长的视频中?

UPDATE

为了澄清一下,我的问题具体在于以下函数调用:

clip = mp.VideoFileClip("/home/test/"+file)

单步执行代码,检查文件的持续时间时似乎出现问题ffmpeg_reader.py它在视频文件中查找持续时间参数。然而,由于文件从未正确完成记录,因此该信息丢失。我不太熟悉视频文件的结构方式,所以我不确定如何从这里继续。


当 moviepy 中的 VideoFileClip(file) 函数查找视频文件中的持续时间参数但该参数丢失时,就会出现此问题。为了避免这种情况(在文件损坏的情况下),您应该在拍摄该功能之前确保总帧数参数不为空:clip = mp.VideoFileClip("/home/test/"+file)

因此,我使用 cv2 以更简单的方式处理它。

想法:

  1. 找出总帧数

  2. 如果frames为空,则调用cv2的writer并生成视频剪辑的临时副本。

  3. 将原始视频中的音频与副本混合。

  4. 替换原始视频并删除副本。

  5. 然后调用该函数clip = mp.VideoFileClip("/home/test/"+file)

澄清:由于 OpenCV VideoWriter 不编码音频,因此新副本将不包含音频,因此有必要从原始视频中提取音频,然后将其与副本混合,然后再将其替换为原始视频。

您必须导入 cv2

import cv2

然后在评估之前在代码中添加类似的内容:

cap = cv2.VideoCapture("/home/test/"+file)
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
print(f'Checking Video {count} Frames {frames} fps: {fps}')

这肯定会返回 0 帧,但至少应返回帧速率 (fps)。 现在我们可以设置评估以避免错误并处理它制作临时视频:

if frames == 0:
    print(f'No frames data in video {file}, trying to convert this video..')
    writer = cv2.VideoWriter("/home/test/fixVideo.avi", cv2.VideoWriter_fourcc(*'DIVX'), int(cap.get(cv2.CAP_PROP_FPS)),(int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))))                  
    while True:
      ret, frame = cap.read()
      if ret is True:
        writer.write(frame)
      else:
        cap.release()
        print("Stopping video writer")
        writer.release()
        writer = None
        break

将原始视频中的音频与副本混合。我为此创建了一个函数:

def mix_audio_to_video(pathVideoInput, pathVideoNonAudio, pathVideoOutput):
  videoclip = VideoFileClip(pathVideoInput)
  audioclip = videoclip.audio
  new_audioclip = CompositeAudioClip([audioclip])
  videoclipNew = VideoFileClip(pathVideoNonAudio)
  videoclipNew.audio = new_audioclip
  videoclipNew.write_videofile(pathVideoOutput)

mix_audio_to_video("/home/test/"+file, "/home/test/fixVideo.avi", "/home/test/fixVideo.mp4")

替换原始视频并删除副本:

os.replace("/home/test/fixVideo.mp4", "/home/test/"+file)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Moviepy 无法读取文件的持续时间 的相关文章

随机推荐

  • C++ 中高效的线程安全单例

    单例类的通常模式是这样的 static Foo getInst static Foo inst NULL if inst NULL inst new Foo return inst 但是 据我了解 此解决方案不是线程安全的 因为 1 Foo
  • 在自托管 WebApi 中获取 HttpRequest 上下文

    如何从自托管 MVC WebAPI 访问查询字符串 对以下内容的调用因 NRE 失败 因为 Current 为空 又名 null System Web HttpContext Current Request myQuery 我需要访问控制器
  • 使用 boost::asio 的 AF_NETLINK (netlink) 套接字

    我正在编写基于的多播客户端 服务器应用程序this and this 效果很好 但是 当计算机中的活动网络接口数量发生变化时 我还需要执行一些操作 例如示例部分中的程序这一页 does 我想我应该使用 boost asio local 中的
  • 在 Windows 服务中运行 cdb 时无法下载 microsoft 符号

    我有一个 NET窗口服务那是在呼唤cdb exe分析故障转储 我想从以下位置下载符号http msdl microsoft com需要时自动使用参数 y srv c symbols http msdl microsoft com downl
  • Python 文件到 MSI Windows 安装程序

    因此 我可以使用 PyInstaller 制作一个单文件可执行文件 并在文件夹中的其他文件中制作标准可执行文件 但是如何将 Python 文件转换为 MSI 安装程序 以便万无一失地在桌面上创建快捷方式呢 用于分发 以便用户不需要安装Pyt
  • Excel进程未关闭[重复]

    这个问题在这里已经有答案了 我有这个 C 程序 它永远不会关闭 Excel 进程 基本上 它会查找某个字符串在 Excel 中某个范围内出现的实例数 我尝试了各种方法 但没有效果 有一个表单正在调用此方法 但这不会改变进程未关闭的原因 我看
  • JQuery / JS:检测用户的滚动尝试,没有任何窗口溢出滚动到

    我正在开发一个过渡网站 虽然我想使用用户的滚动尝试作为过渡启动器 但我不希望有窗口滚动条 现在 我只是用 jquery 检测用户滚动 我已经将窗口大小设置为比用户屏幕的滚动条高 1px 尽管这是我试图避免的 scroll function
  • [Android]NumberPicker 选中项改变颜色

    是否可以更改 numberpicker 中所选项目的颜色 以便每次出现新的中心子 TextView 时将其颜色更改为我喜欢的颜色 但我没有找到任何与此相关的样式或 API 公开 I tried to follow many answers
  • 更改 Chrome 4xx 页面

    我正在部署一个信息亭系统 该系统使用 Chrome 来显示在 jetty 中运行的 java web 应用程序 该应用程序以 Windows 服务包装器启动 系统启动后需要一些时间才能让 jetty 准备好提供内容 因此现在我需要等待 然后
  • 如何按照声明的顺序读取类属性?

    我正在编写一个读取类属性并将它们存储在列表中的元类 但我希望列表 cls columns 尊重声明顺序 即 mycol2 mycol3 zut cool menfin a在我的例子中 import inspect import pprint
  • ActiveMQ Jolokia API 如何获取完整的消息正文

    我想编写自己的 ActiveMQ 监视器 我可以从队列中获取队列和消息 但消息正文 内容 很短 如何获得完整的消息正文 这个我已经测试过了 Get Always errors http localhost 8161 api jolokia
  • 按行数拆分数据框

    我有一个由 400 000 行和大约 50 列组成的数据框 由于这个数据帧太大 处理起来计算量太大 我想将此数据帧分割成更小的数据帧 然后运行我想要运行的函数 然后最后重新组装数据帧 我没有想用来分割此数据框的分组变量 我只想按行数将其拆分
  • Rails/ActiveRecord:将更改保存到模型的关联集合

    我是否必须保存对模型集合中各个项目的修改 或者是否可以在保存模型时调用一种方法来保存它们 save似乎没有这样做 例如 irb gt rental gt
  • 使用 PowerShell 以 UTF-8 写入无 BOM 的文件

    Out File使用 UTF 8 时似乎会强制使用 BOM MyFile Get Content MyPath MyFile Out File Encoding UTF8 MyPath 如何使用 PowerShell 以 UTF 8 格式写
  • 创建已完成的任务

    我正在实现一个方法Task
  • Scala“<-”用于理解

    我发现 Scala 总是对任何事情都有 自然的解释 总是类似 哦 但这只是用这个和那个参数在这个和那个对象上调用的函数 从某种意义上说 没有什么是真正像我们从其他语言中了解到的那样具有编译器魔力 我的问题是关于 lt 运算符如以下代码中所使
  • Jersey 客户端下载并保存文件

    我是球衣 JAX RS 实施的新手 请在下面找到我的球衣客户端代码来下载文件 Client client Client create WebResource wr client resource http localhost 7070 up
  • iPhone 模拟器和 applicationWillTerminate()

    当我的应用程序在 iPhone 模拟器中运行时 委托方法 void applicationWillTerminate UIApplication application 仅在我第一次按下 iPhone 模拟器的主页按钮时调用 按下主页按钮并
  • 找不到模块“puppeteer-core/internal/common/Device.js”

    重现问题的步骤 我使用 npm i puppeteer 安装了 puppeteer 使用 WSL ubuntu 当我尝试在一个简单的测试中加载 puppeteer 时 import puppeteer from puppeteer 我收到错
  • Moviepy 无法读取文件的持续时间

    我一直在使用 Moviepy 将几个较短的视频文件合并为一个小时长的文件 一些小文件被 损坏 它们包含视频但未正确完成 即它们使用 VLC 播放 但没有持续时间 并且您无法在视频中跳过 当我尝试使用 VideoFileClip file 函