Moviepy - 输出视频无法播放
Moviepy - Output video not playable
我在 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
文件确实创建了,而且也有大小(大约20MB)。但是,当我尝试播放它时,什么也没有发生:它似乎已损坏。标准视频播放器甚至告诉我 "there is no video stream to be played".
如果我尝试对交互式控制台做同样的事情,并使用 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
解决了这个问题,因为原始视频具有不同的帧大小。
为了弄清楚发生了什么,我决定按照以下步骤采用更系统化的方法:
- 创建一个虚拟环境,除了
moviepy
及其依赖项 外,不包含任何包
- 使用不同来源的视频
- 尝试不同的编解码器and/or其他不同的参数
- 深入研究
moviepy
的源代码
将一只山羊献祭给光明天使、骗子、谎言之父、咆哮的狮子、毁灭之子撒旦路西法
在每种情况下我都会使用这个脚本 (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")
根据需要进行一些小改动。我会按照步骤更新这个 post。
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
有关键字 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
我在 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
文件确实创建了,而且也有大小(大约20MB)。但是,当我尝试播放它时,什么也没有发生:它似乎已损坏。标准视频播放器甚至告诉我 "there is no video stream to be played".
如果我尝试对交互式控制台做同样的事情,并使用 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
解决了这个问题,因为原始视频具有不同的帧大小。
为了弄清楚发生了什么,我决定按照以下步骤采用更系统化的方法:
- 创建一个虚拟环境,除了
moviepy
及其依赖项 外,不包含任何包
- 使用不同来源的视频
- 尝试不同的编解码器and/or其他不同的参数
- 深入研究
moviepy
的源代码
将一只山羊献祭给光明天使、骗子、谎言之父、咆哮的狮子、毁灭之子撒旦路西法
在每种情况下我都会使用这个脚本 (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")
根据需要进行一些小改动。我会按照步骤更新这个 post。
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
有关键字 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