首页 > 编程语言 >Python实现视频片头和片尾添加(不实用)

Python实现视频片头和片尾添加(不实用)

时间:2024-02-09 11:55:18浏览次数:32  
标签:head 片头 Python 片尾 self tail video entry path

参考的原代码,运行提示:

RuntimeError: imageio.ffmpeg.download() has been deprecated. Use 'pip install imageio-ffmpeg' instead.'

直接删除掉这行:imageio.plugins.ffmpeg.download()

改为:

import imageio
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安装目录下的\Lib\site-packages\imageio_ffmpeg\binaries\ffmpeg-win64-v4.2.2.exe

选择了一个大约400M的mp4,测试拼接,结果发现这个代码不实用! 

 

想像中应该是这样:读一个mp4的尾,读另一个mp4的头,将头和尾连接越来,几秒钟完事。

现实是这样的:代码运行了10分钟以上,预计完成时间在不停增长,似乎永远停留在4%进度上。

 

参考:https://www.cnblogs.com/huangguifeng/p/11296509.html

标签:head,片头,Python,片尾,self,tail,video,entry,path
From: https://www.cnblogs.com/pu369/p/18012394

相关文章

  • Python 机器学习 线性回归 正规方程优化损失函数
    ​Python机器学习中,线性回归模型的参数可以通过正规方程(NormalEquation)直接计算得到,无需使用迭代优化算法如梯度下降。正规方程提供了一种找到成本函数最小值的解析解,从而直接计算出模型参数(系数和截距)。正规方程是一种简单有效的方法,可以用于求解线性回归模型的参数。其优点是......
  • python django4.1 pycharm,报错,Conflicting 'xxx' models in application 'xxx': <
    遇到了一个报错,不知道咋么解决,pythondjango3pycharm,报错。不晓得怎么解决;Conflicting'xxx'modelsinapplication'xxx':<class'xxx'>and<class'xxx'>.这个是 报错误 信息,如下:RuntimeError:Conflicting'faculty'modelsin......
  • Python获取 CPU 温度、CPU 占用、内存总空间、内存占用空间、系统磁盘总空间、系统磁
    先下载依赖pip3installpsutil代码importpsutil#获取CPU温度defget_cpu_temperature():try:temperatures=psutil.sensors_temperatures()if'coretemp'intemperatures:forentryintemperatures['coretemp']:......
  • Python 语法——初步认识语法元素的基本含义
    Python语法——初步认识语法元素的基本含义部分内容对照c语言(实际不影响阅读)以下为3.x内容的Python一、缩进c语言常常用{}来划分包含与层次关系;而Python使用缩进——Tab键或者空格实现(一般为4个空格)二、注释c语言常常用//或者是/**/来进行单行、多行注释;而Python使......
  • Python实现软件设计模式10:装饰器模式 Decorator Pattern
    概念是一种对象结构型模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为是一种用于替代继承的技术,他通过一种无须定义子类的方式给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增......
  • Python调用USB摄像头
    1.硬件连接方式USB摄像头通过USB接口连接到PC。2.使用说明使用的是python3.11.5,程序可以在PyCharm中直接运行。运行后,即可打开一个实时预览窗口,显示摄像头画面。在预览窗口中,按键盘上的‘q’(quit)退出预览,按‘p’(takephoto)拍照。拍照的图片,保存在工程根目录下,名字形如“cv2......
  • python turtle 递归绘制树
    运行效果代码importturtleastimportrandomasrc=["pink","green","lightgreen","orange","red","purple"]defdrawStar(l):t.begin_fill()foriinrange(5):t.forward(l)......
  • 【Python】基于动态残差学习的堆叠式LSTM模型和传统BP在股票预测中的应用
    1.前言本论文探讨了长短时记忆网络(LSTM)和反向传播神经网络(BP)在股票价格预测中的应用。首先,我们介绍了LSTM和BP在时间序列预测中的基本原理和应用背景。通过对比分析两者的优缺点,我们选择了LSTM作为基础模型,因其能够有效处理时间序列数据中的长期依赖关系,在基础LSTM模型的基础上,......
  • Python与anaconda的 pip 冲突
    Python与anaconda的pip冲突1.默认pipinstall会安装到Anaconda下假如我们想要安装到python目录下D:\Python\Python36\Lib\site-packages找到Anaconda安装目录:D:\Anaconda3\python.exe2.验证原生python3python3–mpip–-versionpython3–mpiplist#......
  • python版本管理工具pyenv常见用法
    安装Mac使用brew进行安装:brewupdatebrewinstallpyenv配置环境变量(以zsh为例):echo'exportPYENV_ROOT="$HOME/.pyenv"'>>~/.zshrcecho'[[-d$PYENV_ROOT/bin]]&&exportPATH="$PYENV_ROOT/bin:$PATH"'>&g......