import imageio imageio.plugins.ffmpeg.download() from datetime import datetime import os from moviepy.video.io.VideoFileClip import VideoFileClip from moviepy.video.compositing.concatenate import concatenate_videoclips from threading import Thread from tkinter import Tk, Label, filedialog, Button, Entry, END, Text class App(object): def __init__ (self): self.tk = Tk() self.tk.geometry( " 540x350+10+10 " ) self.tk.resizable(False, False) self.tk.title( " 視頻拼接 " ) # 顯示片頭路徑文本框 self.head_entry = Entry(self.tk) self.head_entry.place(x =150, y=60, width=300, height=30 ) # 顯示需要添加片頭的視頻路徑文本框 self.source_entry = Entry(self.tk) self.source_entry.place(x =150, y=100, width=300, height=30 ) # 顯示需要添加片尾頭的視頻路徑文本框 self.tail_entry = Entry(self.tk) self.tail_entry.place(x =150, y=140, width=300, height=30 ) # 顯示需要添加片尾頭的視頻路徑文本框 self.save_entry = Entry(self.tk) self.save_entry.place(x =150, y=180, width=300, height=30 ) self.log_text = Text(self.tk) self.log_text.place(x =60, y=220, width=330, height=100 ) def show_log(self, info): self.log_text.insert(END, " {} {}\n " .format(datetime.now().strftime( " %H:%M:%S " ), info)) def add_author(self, name, company): # 添加作者名稱 L_author = Label(self.tk, text=f ' 作者:{name} ' ) L_author.config(font = ' Helvetica -10 bold ' , fg= ' #030303 ' ) L_author.place(x =440, y=330 ) # 添加作者公司 L_title = Label(self.tk, text=f ' 公司:{company} ' ) L_title.config(font = ' Helvetica -10 bold ' , fg= ' blue ' ) L_title.place(x =350, y=330 ) def head_video(self): """ 獲取片頭視頻路徑 """ # 按鈕 s_button = Button(self.tk, text=f ' 選擇片頭 ' , command= self.get_head_video_path) s_button.place(x =60, y=60 ) def source_video(self): # 按鈕 s_button = Button(self.tk, text=f ' 選擇視頻 ' , command= self.get_source_video_path) s_button.place(x =60, y=100 ) def tail_video(self): # 按鈕 s_button = Button(self.tk, text=f ' 選擇片尾 ' , command= self.get_tail_video_path) s_button.place(x =60, y=140 ) def save_video(self): # 按鈕 s_button = Button(self.tk, text=f ' 保存路徑 ' , command= self.get_save_video_path) s_button.place(x =60, y=180 ) def get_head_video_path(self): # 獲取到片頭路徑顯示到文本框 head_video_path = filedialog.askopenfilename(title= " 選擇片頭 " ) self.head_entry.delete(0, END) self.head_entry.insert(0, head_video_path) def get_source_video_path(self): # 獲取到需要添加片頭的視頻 source_video_path = filedialog.askopenfilenames(title= " 選擇視頻 " ) self.source_entry.delete(0, END) self.source_entry.insert(0, source_video_path) def get_tail_video_path(self): # 獲取到需要添加片頭的視頻文件夾寫入到文本框 tail_video_path = filedialog.askopenfilename(title= " 選擇片尾 " ) self.tail_entry.delete(0, END) self.tail_entry.insert(0, tail_video_path) def get_save_video_path(self): # 保存文件的路徑 tail_video_path = filedialog.askdirectory(title= " 保存路徑 " ) self.save_entry.delete(0, END) self.save_entry.insert(0, tail_video_path) def get_all_path(self): """ 從文本框獲取路徑,并判斷是否有傳 """ head_video_path = self.head_entry.get() source_video_path = [] if not self.source_entry.get() else self.source_entry.get().split( " " ) tail_video_path = self.tail_entry.get() save_video_path = self.save_entry.get() if not head_video_path and not tail_video_path: self.show_log( " ERROR:請選擇片頭或片尾 " ) return if not source_video_path: self.show_log( " ERROR:請選擇需要加片頭或者片尾的視頻 " ) return if not save_video_path: self.show_log( " ERROR:請選擇保存路徑 " ) return self.show_log( " INFO:路徑正確 " ) return head_video_path, source_video_path, tail_video_path, save_video_path def concat(self): # 獲取到路徑 head_video_path, source_video_path, tail_video_path, save_video_path = self.get_all_path() # 先判斷片頭 if head_video_path and not head_video_path.endswith(( ' .mp4 ' , ' .mkv ' , ' .avi ' , ' .wmv ' , ' .iso ' )): self.show_log( " ERROR: 片頭文件不是視頻格式,錯誤文件%s " % head_video_path) if tail_video_path and not head_video_path.endswith(( ' .mp4 ' , ' .mkv ' , ' .avi ' , ' .wmv ' , ' .iso ' )): self.show_log( " ERROR: 片尾文件不是視頻格式,錯誤文件%s " % head_video_path) if not os.path.exists(save_video_path): self.show_log( " ERROR: 保存文件路徑不存在 " ) return head_video = None tail_video = None if head_video_path: head_video = VideoFileClip(head_video_path) # 加載片頭 if tail_video_path: tail_video = VideoFileClip(tail_video_path) # 加載片尾 for file in source_video_path: th = Thread(target=self._concat,args= (file,head_video,tail_video,save_video_path)) th.start() def _concat(self,file,head_video,tail_video,save_video_path): file_name = os.path.basename(file) self.show_log( " INFO: %s 開始拼接 " % file_name) video_list = [] if not file.endswith(( ' .mp4 ' , ' .mkv ' , ' .avi ' , ' .wmv ' , ' .iso ' )): self.show_log( " ERROR: 視頻格式錯誤,錯誤文件%s " % file_name) return video = VideoFileClip(file) # 加載正片 # 判斷是否有片頭或者片尾,按順序添加 if head_video: video_list.append(head_video) video_list.append(video) if tail_video: video_list.append(tail_video) final_clip = concatenate_videoclips(video_list) # 進行視頻合并 final_clip.write_videofile(os.path.join(save_video_path, file_name)) final_clip.close() self.show_log( " INFO: %s 拼接完成 " % file_name) def start(self): # 開始拼接 s_button = Button(self.tk, text=f ' 開始 ' , command= self.concat) s_button.place(x =415, y=220 ) def run(self): self.add_author( " 黃貴鋒 " , " 恒企教育 " ) self.head_video() # 片頭 self.source_video() self.tail_video() # 片尾 self.save_video() # 保存位置 self.start() # 點擊啟動按鈕 self.tk.mainloop() if __name__ == ' __main__ ' : app = App() app.run()
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
