Moviepy - 输出视频无法播放

时间:2017-10-10 20:52:19

标签: python-3.x moviepy

我在Linux Mint 18.1上使用库moviepy

具体来说,它是moviepy 0.2.3.2

上的python 3.5.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)。但是,当我尝试播放它时,没有任何反应:它似乎已被破坏。标准视频播放器甚至告诉我&#34;没有视频流可以播放&#34;。

如果我尝试对交互式控制台执行相同操作,并使用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 !我通过将method的{​​{1}}设置为mp.concatenate_videoclips来解决了这个问题,因为原始视频的帧大小不同。

1 个答案:

答案 0 :(得分:2)

为了弄清楚发生了什么,我决定采取更加节奏的方法,遵循以下步骤:

  1. 创建一个虚拟环境,不包含moviepy及其依赖项
  2. 以外的其他软件包
  3. 使用其他来源的视频
  4. 尝试不同的编解码器和/或其他不同的参数
  5. 深入了解moviepy
  6. 的源代码
  7. 将一只山羊献给光明天使,欺骗者,谎言之父,咆哮的狮子,毁灭之子撒旦路西法
  8. 在每种情况下,我都会使用此脚本(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创建了一个虚拟环境,将其激活并使用moviepy安装pip。这是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