[英]multiprocessing in python moviepy
在Moviepy上同時並行地將視頻片段作為視頻文件寫入視頻片段,而無需等待該過程完成,
因此,我將視頻分成5秒鍾的片段
n=0
p = 5
clip = mp.VideoFileClip(videofile).subclip(n, n+p)
然后,我在視頻中添加字幕,
x = 0
text2 = 'hello'+str(x)
text[x] = TextClip(text2, font='Amiri-regular',color='white',fontsize=24).set_duration(p).set_start(0)
然后,我對前五個剪輯一次又一次地執行此操作,在第五個剪輯中,我將該剪輯作為視頻文件寫入
我要繼續處理視頻的其余部分,因為寫作會在后台繼續進行,因此在編輯@Roland Smith建議的代碼后,我使用了多重處理,我使用:
if float.is_integer(float(x)/5.0) == True and x != 0:
text2 = concatenate(text.values())
textd = text2.on_color(size=(clip.w ,text2.h),color=(0,0,0), col_opacity=0.6).set_pos('bottom')
video3[n] = CompositeVideoClip([VideoFileClip(videofile).subclip(n,5+n), textd])
def audioclip(data):
outname = str(data)[-10:].strip('>') + '.mp4'
data.write_videofile(outname,fps=24, codec='libx264')
return outname
names = video3.values()
h = multiprocessing.Pool()
audiofiles = h.map(audioclip, names)
gc.collect()
n = n+p
x = x+1
我已經進口了
from moviepy.editor import *
import moviepy.editor as mp
import os
import multiprocessing
from multiprocessing import pool
但是,我收到此錯誤:
Traceback (most recent call last):
File "p2 (copy).py", line 128, in <module>
audiofiles = h.map(audioclip, names)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
raise self._value
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
請幫忙
您的問題尚不完全清楚,但我想我會向您展示如何並行進行音頻提取。
您提供的第一個代碼片段應重新設計為一個函數。
import moviepy.editor as mp
from multiprocessing import pool
def audioclip(input):
clip = mp.VideoFileClip(input).subclip(0,20)
outname = input[:-3] + 'mp3'
clip.audio.write_audiofile(outname)
return outname
此外,您將需要輸入文件名列表。 然后,使用multiprocessing.Pool
對象的map
方法,將上述函數應用於所有視頻。
# You should probably take the names from the command line...
names = ['foo.mp4', 'bar.mp4', 'spam.mp4', 'eggs.mp4']
p = multiprocessing.Pool()
audiofiles = p.map(audioclip, names)
默認情況下,這將從剪輯中並行提取音頻,所使用的工作進程數量與CPU具有內核的數量相同。
編輯 :請注意,如果使用map
,則必須對可迭代項進行腌制並將其發送到工作進程。 為了避免使用大量資源,最好將一個大文件的名稱發送給工作進程(這樣它就可以讀取文件本身)而不是該文件的內容 。 否則,這將很快成為該過程的瓶頸。 如果多個工作人員都必須讀取同一個文件,這可能看起來很浪費,但是所有現代操作系統都需要進行文件系統緩存,這可以緩解這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.