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()

Python实现视频片头和片尾添加的更多相关文章

  1. Python学习笔记7 头文件的添加规则(转载)

    转载自:https://www.cnblogs.com/taurusfy/p/7605787.html ************************************************ ...

  2. [原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作

    [原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作 转载请注明出处 一.关于为什么用pymediainfo以及pymediainfo的安装 使用python对视频/音频文件进行详 ...

  3. Linux-NGINX 能否添加P3P头,如何添加。 - 德问:编程社交问答

    Linux-NGINX 能否添加P3P头,如何添加. - 德问:编程社交问答   您的投票让 杜鑫 声誉值增加5分. 支持投票,不仅能让提问用户获得声誉值,让好的问题有更多的曝光,更能帮助社区筛选出好 ...

  4. Python远程视频监控

    Python远程视频监控程序   老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可 ...

  5. [视频]K8飞刀 WordPress XSS添加管理员 & GetShell 教程

    [视频]K8飞刀 WordPress  XSS添加管理员 & GetShell 教程 https://pan.baidu.com/s/1hq4LsmK

  6. 零基础快速掌握Python系统管理视频课程【猎豹网校】

    点击了解更多Python课程>>> 零基础快速掌握Python系统管理视频课程[猎豹网校] 课程目录 01.第01章 Python简介.mp4 02.第02章 IPython基础.m ...

  7. python全套视频十五期(116G)

    python全套视频,第十五期,从入门到精通,基础班,就业班,面试,软件包 所属网站分类: 资源下载 > python视频教程 作者:精灵 链接:http://www.pythonheidong ...

  8. Python学习教程(Python学习视频_Python学些路线):Day06 函数和模块的使用

    Python学习教程(Python学习视频_Python学些路线):函数和模块的使用 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. $$x_1 + x_2 + x ...

  9. [Python] 将视频转成ASCII符号形式、生成GIF图片

    一.简要说明 简述:本文主要展示将视频转成ASCII符号形式展示出来,带音频. 运行环境:Win10/Python3.5. 主要模块: PIL.numpy.shutil. [PIL]: 图像处理 [n ...

随机推荐

  1. python的setup.py文件

    最近工作需要,用Cython写了*.pyx扩展,并将其编译成C文件,最后转换为so扩展,供python引用使用 distutils 编译,建立一个setup.py 的脚本from distutils. ...

  2. 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程

    目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...

  3. cryto-js 常用加密库 md5加密

    安装 npm i crypto-js 使用 import CryptoJs from 'crypto-js' CryptoJs.MD5(password).toString() password 会被 ...

  4. makefile 赋值

    = 是最基本的赋值:= 是覆盖之前的值?= 是如果没有被赋值过就赋予等号后面的值+= 是添加等号后面的值

  5. Activiti的流程实例及挂起激活(七)

    1.1什么是流程实例 参与者(可以是用户也可以是程序)按照流程定义内容发起一个流程,这就是一个流程实例.是动态的.流程定义和流程实例的图解: 1.2启动流程实例 流程定义部署在 activiti 后, ...

  6. 【bzoj1096】[ZJOI2007]仓库建设

    *题目描述: L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总 ...

  7. [BZOJ3199][SDOI2013]escape:半平面交

    分析 好像叫V图什么的. 容易发现,对于每个点,其监视的范围就是这个点与其它所有点的垂直平分线分割平面后的半平面交.由于数据范围很小,所以我们可以直接枚举每个点,使用双端队列求出其监视的范围.若两个点 ...

  8. 获取浏览区变化的方法resize() 方法

    当调整浏览器窗口的大小时,发生 resize 事件. resize() 方法触发 resize 事件,或规定当发生 resize 事件时运行的函数. <html> <head> ...

  9. Mybatis,模糊查询语句,以及传参数的正确写法

    不多说直接上代码! 接口: public interface CommodityMapper { int deleteByPrimaryKey(Integer productId); int inse ...

  10. ANativeWindow_fromSurface

    c++后台若使用ANativeWindow_fromSurface将surface转化为ANativeWindow: 需要头文件:#include <android/native_window_ ...