123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- import openshot
- import os
- import re
- from PIL import Image,ImageDraw,ImageFont
- def cKey(r,g,b,fuzz):
- col=openshot.Color()
- col.red=openshot.Keyframe(r)
- col.green=openshot.Keyframe(g)
- col.blue=openshot.Keyframe(b)
- return openshot.ChromaKey(col, openshot.Keyframe(fuzz))
- def video_writer_init(path):
- w = openshot.FFmpegWriter(path)
- w.SetAudioOptions(True, "aac", 44100, 2, openshot.LAYOUT_STEREO, 3000000)
- w.SetVideoOptions(True, "libx264", openshot.Fraction(30000, 1000), 1280, 720,
- openshot.Fraction(1, 1), False, False, 3000000)
- return w
- def video_photo_clip(video=None,layer=None, position=None, end=None
- ,scale_x=1,scale_y=1,location_x=0,location_y=0,ck=None,audio=True):
- clip = openshot.Clip(video)
- clip.Layer(layer)
- clip.Position(position)
- clip.End(end)
- clip.scale_x=openshot.Keyframe(scale_x)
- clip.scale_y=openshot.Keyframe(scale_y)
- clip.location_x=openshot.Keyframe(location_x)
- clip.location_y=openshot.Keyframe(location_y)
-
- if ck!=None:
- clip.AddEffect(ck)
- if audio==True:
- clip.has_audio=openshot.Keyframe(1)
- else:
- clip.has_audio=openshot.Keyframe(0)
- return clip
- def trim_punctuation(s):
- pat_block = u'[^\u4e00-\u9fff0-9a-zA-Z]+'
- pattern = u'([0-9]+{0}[0-9]+)|{0}'.format(pat_block)
- res = re.sub(pattern, lambda x: x.group(1) if x.group(1) else u" " ,s)
- return res
- def txt2image(content, save_target,lang='zh',size=26,fon="font/DFT_B7.ttc"):
- unicode_text = trim_punctuation(content)
- font = ''
- if lang=='zh':
- font = ImageFont.truetype(font=fon, size=size)
- else :
- font = ImageFont.truetype(font="font/arial.ttf", size=size)
- text_width, text_height = font.getsize(unicode_text)
- W, H = (1280,500)
- canvas = Image.new('RGBA', (W, H), (255, 255, 255, 0) )
- draw = ImageDraw.Draw(canvas)
- w, h = draw.textsize(content,font = font)
- text= unicode_text
- draw.text(((W-w)/2,0), text,'black', font)
- canvas.save(save_target, "PNG")
- def text_to_short_vedio(bg,text_form,vedio_time):
- t = openshot.Timeline(1280, 720, openshot.Fraction(30000, 1000), 44100, 2, openshot.LAYOUT_STEREO)
- t.Open()
-
- # 去背參數
- ck = cKey(0, 254, 0, 270)
- ck_anchor = cKey(0, 255, 0, 320)
- anchor = openshot.FFmpegReader(bg)
- anchor.Open()
- anchor_clip = video_photo_clip(video=anchor,layer=2,scale_x=1,scale_y=1,
- location_x=0,location_y=0,position=0, end=vedio_time,ck=ck_anchor,audio=True)
- t.AddClip(anchor_clip)
- anchor.Close()
- for text_tmp in text_form:
- print(text_tmp['text'])
- time = float(text_tmp['end']) - float(text_tmp['start'])
- file_name = "tmp/save_target_" + text_tmp['text'] + ".png"
- txt2image(text_tmp['text'], file_name,lang='zh',size = text_tmp['size'])
- exec('text_anchor_{} = openshot.QtImageReader("tmp/save_target_{}.png")'.format(text_tmp['text'],text_tmp['text']))
- exec('text_anchor_{}.Open()'.format(text_tmp['text']))
- exec('text_anchor_{}.Open()'.format(text_tmp['text']))
- exec('text_anchor_clip_{} = video_photo_clip(video=text_anchor_{},layer=4,scale_x=1,scale_y=1,\
- location_x=0,location_y=0.7,position=text_tmp["start"], end=time,ck=ck_anchor,audio=True)'.format(text_tmp['text'],text_tmp['text']))
- exec('t.AddClip(text_anchor_clip_{})'.format(text_tmp['text']))
- exec('text_anchor_{}.Close()'.format(text_tmp['text']))
- exec('os.remove("tmp/save_target_{}.png")'.format(text_tmp['text']))
-
- w = video_writer_init("output/test2.mp4")
- w.Open()
- frames = int(t.info.fps)*int(vedio_time)
- for n in range(frames):
- f=t.GetFrame(n)
- w.WriteFrame(f)
- t.Close()
- w.Close()
- if __name__ == '__main__':
- text_form = [{'text':"texttexttext",'start':0,'end':3,'size':26},{'text':"test22222222",'start':4,'end':6,'size':26}]
- text_to_short_vedio("input/bg/dog.mp4",text_form,6)
|