moviepy使用的坑

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的自己就不是真正的自己了,人生艰难
首先记录一下基本操作

  1. 视频拼接
L = []
video1 = VideoFileClip(filePath1)
L.append(video1)
video2 = VideoFileClip(filePath2)
L.append(video2)
final_clip = concatenate_videoclips(L, method='compose')
  1. 视频截取
clip = clip.subclip(start, end)
  1. 获取视频时长(s)
file_time = clip.duration
  1. 写入视频
final_clip.to_videofile(str(file), fps=30, remove_temp=True)

接下来是坑。。。

  1. 报错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

你可能感兴趣的:(视频预处理)