moviepy使用的坑
最近打算确定做多媒体跨模态方向,主要是视频和音频之间的生成问题,希望对我这个菜鸟友好一点。。。
由于拖延症晚期,最近终于开始了——数据集的下载orz
还是决定写博客来记录一下,毕竟我记性真的差,顺便督促一下自己,以下代码很多是从各个搜索出来的页面上找的,记不清具体都是哪里的了,所以如果有侵权的话请联系我删除
youtube-dl
首先,我们要有一个数据集(废话x
有些视频数据集是直接打包好的,对于我这种懒人来说十分友好;但也有许多数据集只提供了一个json文件,里面包含了对应的youtube视频id,对于一个编程极差记性又不好的人,我决定记录一下过程。
首先 import
import youtube_dl
import json
然后读取json文件
f = open("data.json","r")
contents = json.load(f)
contents是一个字典
#这里是两层,所以两个key,读取最里层的内容
#我的数据id1是一个列表,里面是这类视频的id列表
id1 = contents[key1][key2]
构造url,调用youtube-dl下载
url = 'https://www.youtube.com/watch?v='
for id in id1:
url1 = url + str(id)
print(url1)
#防止列表里有的视频失效
try:
youtube_dl.YoutubeDL().download([url1])
except:
print('no video')
moviepy
下载下来的视频一般时长差别很大,我想要把它们剪辑拼接成等长的片段,手工的话实在太耗时,于是搜一搜发现python有现成的视频操作的库moviepy,本来就在我开心地以为胜利就在前方的时候,我的代码又不断报错,瑟瑟发抖,不会写bug的自己就不是真正的自己了,人生艰难
首先记录一下基本操作
- 视频拼接
L = []
video1 = VideoFileClip(filePath1)
L.append(video1)
video2 = VideoFileClip(filePath2)
L.append(video2)
final_clip = concatenate_videoclips(L, method='compose')
- 视频截取
clip = clip.subclip(start, end)
- 获取视频时长(s)
file_time = clip.duration
- 写入视频
final_clip.to_videofile(str(file), fps=30, remove_temp=True)
接下来是坑。。。
- 报错OSError: [WinError 6] The handle is invalid
可能是进程的问题,对每一个写入的clip都要关闭相应的进程,具体原因是为啥emmm我不太懂,反正可以解决就ok啦
#在写完后关闭进程
for clip in L:
close_clip(clip)
具体关闭的函数close_clip
写法看这个链接:https://github.com/Zulko/moviepy/issues/823
2.报错 AttributeError: ‘NoneType’ object has no attribute 'stdout’
在解决完上一个问题后,我立马又获得了一个新问题耶/(ㄒoㄒ)/~~
这个问题解决方法请参考:https://github.com/Zulko/moviepy/issues/938
主要有两个解决方法:第一,把moviepy降成1.0.0版;第二,修改AudioFileClip.py文件,具体方法见链接
至此终于可以运行啦( •̀ ω •́ )y