python-3.x - Moviepy - 输出视频无法播放

标签 python-3.x moviepy

我在 Linux Mint 18.1 上使用库 moviepy

具体来说,它是 python 3.5.2 上的 moviepy 0.2.3.2

自从我开始使用以来,我尝试了这个简单的脚本,它应该将两个视频一个接一个地连接起来:

import moviepy.editor as mp

video1 = mp.VideoFileClip("short.mp4")
video2 = mp.VideoFileClip("motivation.mp4")

final_video = mp.concatenate_videoclips([video1,video2])
final_video.write_videofile("composition.mp4")

这两个视频是我从 YouTube 下载的随机短视频。它们都可以完美地与 VLC 和 Linux Mint 提供的标准视频播放器配合使用。

脚本运行良好,没有错误,最终消息:

[MoviePy] >>>> Building video composition.mp4
[MoviePy] Writing audio in compositionTEMP_MPY_wvf_snd.mp3
100%|██████████████████████████████| 1449/1449 [00:23<00:00, 59.19it/s]
[MoviePy] Done.
[MoviePy] Writing video composition.mp4
100%|██████████████████████████████| 1971/1971 [11:34<00:00,  2.84it/s]
[MoviePy] Done.
[MoviePy] >>>> Video ready: composition.mp4 

文件确实已创建,并且它也有大小(大约 20 MB)。然而,当我尝试播放它时,没有任何反应:它似乎已损坏。标准视频播放器甚至告诉我“没有视频流可播放”。

如果我尝试对交互式控制台执行相同的操作,并使用 final_video.preview(),我会收到 AttributeError 以及此回溯:

In [5]: final_video.preview()
Exception in thread Thread-417:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "<decorator-gen-211>", line 2, in preview
  File "/usr/local/lib/python3.5/dist-packages/moviepy/decorators.py", line 54, in requires_duration
    return f(clip, *a, **k)
  File "/usr/local/lib/python3.5/dist-packages/moviepy/audio/io/preview.py", line 49, in preview
    sndarray = clip.to_soundarray(tt,nbytes=nbytes, quantize=True)
  File "<decorator-gen-184>", line 2, in to_soundarray
  File "/usr/local/lib/python3.5/dist-packages/moviepy/decorators.py", line 54, in requires_duration
    return f(clip, *a, **k)
  File "/usr/local/lib/python3.5/dist-packages/moviepy/audio/AudioClip.py", line 107, in to_soundarray
    fps = self.fps
AttributeError: 'CompositeAudioClip' object has no attribute 'fps'

视频似乎卡住在第一帧。

我没有任何线索,因为一切似乎都工作正常(预览除外,由于错误而无法工作)。我尝试重新安装 ffmpeg,但没有成功:一切都完全相同。没有任何有用的错误,我不知道如何解决这个问题。谁能帮我吗?

编辑:这 4 个神奇字母是什么? R-T-F-M!我通过将 mp.concatenate_videoclips 的 kwarg method 设置为 compose 解决了这个问题,因为原始视频具有不同的帧大小。

最佳答案

为了希望弄清楚发生了什么,我决定采取更系统的方法,遵循以下步骤:

  1. 创建一个虚拟环境,除了 moviepy 及其依赖项之外,不包含其他任何软件包
  2. 使用不同来源的视频
  3. 尝试不同的编解码器和/或其他不同的参数
  4. 深入研究moviepy的源代码
  5. 向光明天使、欺骗者、谎言之父、咆哮的狮子、毁灭之子撒旦路西法献祭一只山羊

在每种情况下,我都会使用这个脚本(test.py):

import moviepy.editor as mp

video1 = mp.VideoFileClip("short.mp4")
video2 = mp.VideoFileClip("motiv_30.mp4")

final_video = mp.concatenate_videoclips([video1,video2])
final_video.write_videofile("composition.mp4")

根据需要进行一些细微的更改。我将按照步骤更新这篇文章。

<强>1。创建虚拟环境

我使用virtualenv创建了一个虚拟环境,激活它并使用pip安装了moviepy。这是pip freeze的输出:

decorator==4.0.11
imageio==2.1.2
moviepy==0.2.3.2
numpy==1.13.3
olefile==0.44
Pillow==4.3.0
tqdm==4.11.2

全部使用python 3.5.2

运行test.py后,视频已创建,没有明显问题。但是,VLC 和 Linux Mint 18.1 的默认视频播放器都无法播放该视频。

然后,我注意到 mp.concatenate_videoclips 有 kwarg method,默认设置为 chain。在文档中,我读到:

- method="compose", if the clips do not have the same
  resolution, the final resolution will be such that no clip has
   to be resized.

因此,我尝试使用 kwarg method="compose",因为这两个视频具有不同的帧大小并且...它有效。我是一个白痴。哦,好吧,我想撒旦不会有山羊。经验教训:RTFM

关于python-3.x - Moviepy - 输出视频无法播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46675809/

相关文章:

python - 使用 Python MoviePY 连接视频太慢

python - MoviePY 无法在 Windows 上检测 ImageMagick 二进制文件

python - 如果字典有多个值,如何使用 try except ?

python-3.x - python 中的 sys.exit 给出一个 SystemExit 错误 pystray

python - 使用python中的os将文件名放入数组中

python-3.x - 合成 MP4 时 png 周围有电影般的黑色边框

python - 如何有效地利用多处理和多线程并行使用 python 将 1000 个视频文件转换为音频

mysql - 如何在 django2 中编写类似原始查询的查询?

python - 遵循 YouTube 上的 Pygame/Python 教程时出现语法错误

python - 如何在 tkinter 窗口中显示视频预览