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

