def make_zoom(scale_func, path=im_path, cx=32, cy=32, scale=10, duration=5, fps=10, oversample=2.0): ic = ImageClip(path).resize(oversample) bg = ColorClip((ic.w, ic.h), (0xFF, 0xFF, 0xFF)).set_duration(duration) ic.duration = duration cx *= oversample cy *= oversample total_frames = int(duration * fps) def zoom_between_frames(startf, endf): scales = [scale_func(startf + f * (endf - startf) / total_frames) for f in range(total_frames)] return make_zoom_movie(ic, scales, fps, (cx, cy)) # we seem to get two multiple frames at the start... # and end sometimes ret = CompositeVideoClip([ bg, zoom_between_frames(total_frames, 2.0 * total_frames), zoom_between_frames(0, total_frames) ]) ret.size = ic.size # ret.duration = duration return ret.resize(1.0/oversample)
def make_zoom(scale_func, path=im_path, cx=32, cy=32, scale=10, duration=5, fps=10, oversample=2.0): ic = ImageClip(path).resize(oversample) bg = ColorClip((ic.w, ic.h), (0xFF, 0xFF, 0xFF)).set_duration(duration) ic.duration = duration cx *= oversample cy *= oversample total_frames = int(duration * fps) def zoom_between_frames(startf, endf): scales = [ scale_func(startf + f * (endf - startf) / total_frames) for f in range(total_frames) ] return make_zoom_movie(ic, scales, fps, (cx, cy)) # we seem to get two multiple frames at the start... # and end sometimes ret = CompositeVideoClip([ bg, zoom_between_frames(total_frames, 2.0 * total_frames), zoom_between_frames(0, total_frames) ]) ret.size = ic.size # ret.duration = duration return ret.resize(1.0 / oversample)
def vid_from_media(vid_path, media, song_path, titles, img_duration=8): clips = [] print "sequencing media..." for m in media: print m.path if good_file(m.path): try: if is_img(m.path): new_clip = ImageClip(m.path) new_clip.fps = 1.0 / img_duration new_clip.duration = img_duration else: new_clip = VideoFileClip(m.path) text = m.title if titles else None new_clip = format_clip(new_clip, text) clips.append(new_clip) except Exception as err: "COULDN'T CREAT CLIP BECAUSE: " + str(err) else: print 'CORRUPT FILE FOUND: ' + m.path + ', skipping.' vid = concatenate_videoclips(clips) print song_path audio = AudioFileClip(song_path) audio_loops = int(vid.duration / audio.duration) + 1 #times to loop audio audio = concatenate_audioclips([audio] * audio_loops) print audio.duration print vid.duration audio = audio.set_duration(vid.duration) vid = vid.set_audio(audio) print "writing video..." vid.write_videofile(vid_path, progress_bar=False, preset='ultrafast') return abspath(vid_path)
def video_creation(): # command line arguments [main.py, image, audio, min_length, movie_name] if len(sys.argv) < 5: arg_error('{0} args supplied but {1} args required.'.format( len(sys.argv) - 1, 4)) location = '' # default is no location, i.e., save video in working directory if len(sys.argv) > 5: if len(sys.argv[5]) > 0: # allow empty path for future compatibility location = sys.argv[5] # append slash if required if location[-1] != '/' and location[-1] != '\\': location += '/' try: # create directory if needed (works recursively) pathlib.Path(location).mkdir(parents=True, exist_ok=True) except Exception as e: arg_error( 'problem with location \'{0}\'. Either it could not be found or it could not be created.' .format(location), e) image_src = sys.argv[1] audio_src = sys.argv[2] try: min_length = int( str(sys.argv[3]).split( # format: Minutes.Seconds '.')[0]) * 60 + int(str( sys.argv[3]).split('.')[1]) # converted to seconds except Exception as e: arg_error( '[min_length] not parsable. \'{0}\' was supplied when the correct format is \'numbers.numbers\', e.g., \'123.59\'.' .format(sys.argv[3]), e) if min_length < 1: min_length = 1 # keep min_length no smaller than one second movie_name = sys.argv[4] + '.mp4' # beginning of moviepy functions image_clip = ImageClip(image_src) # get image audio = AudioFileClip(audio_src) # get audio # how many complete audio loops are needed to meet the min_length? loops_needed = int(min_length / audio.duration + 1) # loop our audio to meet the min_length audio = audio_loop.audio_loop(audio, nloops=loops_needed) # set up our clip image_clip = image_clip.set_audio(audio) image_clip.fps = 24 image_clip.duration = audio.duration # render! image_clip.write_videofile(location + movie_name, preset='ultrafast', threads=multiprocessing.cpu_count())
LEFTCOL = 450 RIGHTCOL = 490 TEXTSIZE = 28 LINE_HEIGHT = 50 SCROLLSPEED = 130 BOTTOM_START = H * 1.2 N_NAMES = 30 # load image that does not move at all LOGO_POS = 950, 300 LOGO_SIZE = 235, 298 LOGO = ImageClip("panda.png").resize(LOGO_SIZE).set_pos(LOGO_POS) LOGO.duration = DURATION # create fake text fake = Factory.create() text = [] while len(text) < N_NAMES: job = fake.job() name = fake.name() if len(job) < 25: text.append((job, name)) def make_frame(t): """Draw text elements in each frame""" surface = gz.Surface(W, H, bg_color=(0,0,0))
# zh_title=translat(str(en_title)) # print(zh_title) main_clip = VideoFileClip(r'./videos/{}'.format(mp4)) leader = VideoFileClip(r'./material/leader.mp4') leader = leader.resize(main_clip.size) # main_clip=main_clip.resize(leader.size) # leader.duration=3 # clip1=clip.fx(vfx.mirror_x) # clip2=clip.fx(vfx.mirror_y) # clip2=clip.resize(0.5) logo = ImageClip(r'./material/logo.png') logo.duration = main_clip.duration logo.resize((350, 150)) # logo_end_gif= concatenate = concatenate_videoclips([leader, main_clip]) if os.path.exists(r'./subtitle/{}.srt'.format(en_title)): with open(r'./subtitle/{}.srt'.format(en_title), 'rb') as f: pass # print(f.read()) # en_sub=f.read() # zh_sub=translat(en_sub) # zh_srt=open(r'./subtitle/translated/{}.srt'.format(en_title),'wb') # zh_srt.write(zh_sub)
def func_edit(self): import os import os.path from moviepy.video import VideoClip from moviepy.editor import VideoFileClip, vfx, concatenate_videoclips, CompositeVideoClip, \ ImageClip, TextClip # from moviepy.video.compositing import CompositeVideoClip from moviepy.video.tools.subtitles import SubtitlesClip from googletrans import Translator def translat(text='no text is passed'): trans = Translator() result = trans.translate(text, dest='zh-CN', src='en').text # Translated(src=en, dest=zh-cn, text=你好, pronunciation=Nǐ hǎo, extra_data="{'translat...") # print(result.text) return result def translat_subtitle(file): for i, line in enumerate(file.readline()): print(i, line) translated_sub = open(r'/home/master/subtitle/translated/{}.srt'.format(en_title), 'w',encoding='utf-8') if i % 4 == 2 or i == 2: # doc='' # doc=doc+str(line) translated_line = translat(line) translated_sub.write(translated_line) else: translated_sub.write(line) return translated_sub for mp4 in os.listdir(r'/home/master/unvideos'): en_title = os.path.basename(mp4).split('.')[0] zh_title = translat(str(en_title)) print(zh_title) main_clip = VideoFileClip(r'/home/master/unvideos/{}'.format(mp4)) leader = VideoFileClip(r'./material/leader.mp4') main_clip=main_clip.resize(leader.size) # leader.duration=3 # clip1=clip.fx(vfx.mirror_x) # clip2=clip.fx(vfx.mirror_y) # clip2=clip.resize(0.5) concatenate = concatenate_videoclips([leader, main_clip]) logo = ImageClip(r'./material/logo.png') logo.duration = main_clip.duration logo.resize((350,150)) # logo_end_gif= if os.path.exists(r'/home/master/subtitle/{}.srt'.format(en_title)): with open(r'/home/master/subtitle/{}.srt'.format(en_title), 'rb') as f: pass # print(f.read()) # en_sub=f.read() # zh_sub=translat(en_sub) # zh_srt=open(r'./subtitle/translated/{}.srt'.format(en_title),'wb') # zh_srt.write(zh_sub) # zh_srt=translat_subtitle(f) font = "ArialUnicode" color = 'white' generator = lambda txt: TextClip(txt, font=font, fontsize=40, color=color) # sub=SubtitlesClip(r'./subtitle/translated/{}.srt'.format(en_title),'rb') sub = SubtitlesClip(r'/home/master/subtitle/{}.srt'.format(en_title), generator) # final=clips_array([[clip1,clip2]]) final = CompositeVideoClip([concatenate, sub.set_start(3).set_pos('bottom'), logo.set_start(3).set_pos((1400,100)).crossfadein(2)]) # final.write_videofile('add_subtitle.mp4',fps=clip.fps) final.write_videofile('/home/master/edited/{}.mp4'.format(en_title), fps=main_clip.fps) else: final = CompositeVideoClip([concatenate, logo.set_start(3).set_pos((1400,100)).crossfadein(2)]) final.write_videofile('/home/master/edited/{}.mp4'.format(en_title), fps=main_clip.fps,audio=True,verbose=True)