视频分割合并工具说明

news2025/1/19 2:58:57

使用说明书:视频分割合并工具

欢迎使用视频生成工具!本工具旨在帮助您将视频文件按照指定的规则分割并合并,以生成您所需的视频。
本程序还自带提高分辨率1920:1080,以及增加10db声音的功能

软件下载地址

https://github.com/cmdch2017/-python-

步骤1:选择视频文件

  1. 点击 “Select Multiple Input Files” 按钮,选择您要处理的视频文件。您可以同时选择多个视频文件。
  2. 选择的文件将会显示在下方的文件列表中。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

步骤2:设置分割和合并规则

  1. 在 “Segment Interval (seconds):” 文本框中,输入希望分割视频的时间间隔(以秒为单位)。例如,若要每隔5分钟分割一次,输入300。
  2. 在 “Segment Duration (seconds):” 文本框中,输入每个分割片段的持续时间(以秒为单位)。例如,若希望每个片段为30秒,输入30。
  3. 在 “Start Time (seconds):” 文本框中,输入每个分割片段的起始时间(以秒为单位)。
  4. 在 “End Time (seconds):” 文本框中,输入每个分割片段的结束时间(以秒为单位)。

步骤3:生成视频

  1. 点击 “Generate Selected Videos” 按钮,工具将会按照您的设置生成分割后的视频。
  2. 在生成的过程中,工具将在状态栏中显示当前进度。
    在这里插入图片描述

步骤4:保存生成的视频

  1. 生成完成后,工具将在指定的输出文件夹中保存生成的视频文件。
  2. 输出文件的命名规则为 “merged_output.mp4”,若有重名文件,将会自动添加编号。
    在这里插入图片描述

步骤5:找到视频文件

  1. 生成的视频放在软件目录的output_videos文件夹下。
    在这里插入图片描述

注意事项

  • 本工具依赖于 FFmpeg 库进行视频处理,请确保您的电脑已安装 FFmpeg。
  • 请确保您选择的视频文件格式为 MP4 格式。

联系我们

如有任何问题或建议,请随时联系我们:congminglst@163.com
或者评论区直接提问,如果对您有帮助,请点个赞谢谢

源代码

import subprocess
import os
import tkinter as tk
from tkinter import ttk, filedialog
from ttkthemes import ThemedStyle


def generate_videos(input_file, segment_interval, segment_duration, start_time, end_time):
    output_folder = "output_videos"
    os.makedirs(output_folder, exist_ok=True)

    ffprobe_cmd = [
        "ffprobe", "-v", "error", "-show_entries", "format=duration",
        "-of", "default=noprint_wrappers=1:nokey=1", input_file
    ]
    total_duration = float(subprocess.check_output(ffprobe_cmd, universal_newlines=True))

    merged_segments = []

    for index, start_time in enumerate(range(start_time, int(total_duration), segment_interval), start=1):
        end_time = start_time + segment_duration
        output_segment = os.path.join(output_folder, f"segment_{index}.mp4")
        merged_segments.append(output_segment)

        cmd = [
            "ffmpeg", "-ss", str(start_time), "-i", input_file, "-t", str(segment_duration),
            "-vf", "scale=1920:1080", "-b:v", "2048k", "-c:v", "libx264",
            "-c:a", "aac", "-b:a", "192k", "-af", "volume=10dB",
            output_segment
        ]

        subprocess.run(cmd)

    # Construct the list of existing segment files for concatenation
    valid_segments = [segment for segment in merged_segments if os.path.exists(segment)]

    concat_list_path = os.path.join(output_folder, "concat_list.txt")
    with open(concat_list_path, "w") as f:
        for segment in valid_segments:
            f.write(f"file '{os.path.basename(segment)}'\n")

    merged_output_base = "merged_output"
    index = 1
    merged_output = os.path.join(output_folder, f"{merged_output_base}.mp4")
    while os.path.exists(merged_output):
        merged_output = os.path.join(output_folder, f"{merged_output_base}{index}.mp4")
        index += 1

    concat_cmd = ["ffmpeg", "-f", "concat", "-safe", "0", "-i", concat_list_path, "-c", "copy", merged_output]
    subprocess.run(concat_cmd)

    for segment in merged_segments:
        os.remove(segment)
    os.remove(concat_list_path)

    return merged_output


def select_input_files():
    input_files = filedialog.askopenfilenames(filetypes=[("Video files", "*.mp4")])
    selected_files_listbox.delete(0, tk.END)
    for file in input_files:
        selected_files_listbox.insert(tk.END, file)


def generate_selected_videos():
    segment_interval = int(segment_interval_var.get())
    segment_duration = int(segment_duration_var.get())
    start_time = int(start_time_var.get())
    end_time = int(end_time_var.get())
    selected_files = selected_files_listbox.get(0, tk.END)
    total_videos = len(selected_files)

    for index, input_file in enumerate(selected_files, start=1):
        status_label.config(text=f"Generating video {index} of {total_videos}")
        root.update_idletasks()
        output_file = generate_videos(input_file, segment_interval, segment_duration, start_time, end_time)
        status_label.config(text=f"Generating video {index + 1} of {total_videos}")
        root.update_idletasks()

    status_label.config(text="All videos generated. Click OK to continue.")
    ok_button.pack(fill=tk.BOTH, padx=10, pady=(10, 0))
    selected_files_listbox.delete(0, tk.END)


def close_app():
    root.destroy()


root = tk.Tk()
root.title("Video Generation Tool")

style = ThemedStyle(root)
style.set_theme("equilux")
style.configure("TFrame", background="#e0e0e0")
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
window_width = 400
window_height = 700
x = (screen_width - window_width) // 2
y = (screen_height - window_height) // 2
root.geometry(f"{window_width}x{window_height}+{x}+{y}")

select_multiple_button = ttk.Button(root, text="Select Multiple Input Files", command=select_input_files)
select_multiple_button.pack(fill=tk.BOTH, padx=10)

selected_files_listbox = tk.Listbox(root, selectmode=tk.MULTIPLE)
selected_files_listbox.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

segment_interval_label = ttk.Label(root, text="Segment Interval (seconds):")
segment_interval_label.pack(fill=tk.BOTH, padx=10, pady=(10, 0))

segment_interval_var = tk.StringVar(value="300")
segment_interval_entry = ttk.Entry(root, textvariable=segment_interval_var)
segment_interval_entry.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10))

segment_duration_label = ttk.Label(root, text="Segment Duration (seconds):")
segment_duration_label.pack(fill=tk.BOTH, padx=10, pady=(10, 0))

segment_duration_var = tk.StringVar(value="30")
segment_duration_entry = ttk.Entry(root, textvariable=segment_duration_var)
segment_duration_entry.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10))

start_time_label = ttk.Label(root, text="trimming video duration from the start (seconds):")
start_time_label.pack(fill=tk.BOTH, padx=10, pady=(10, 0))

start_time_var = tk.StringVar(value="0")
start_time_entry = ttk.Entry(root, textvariable=start_time_var)
start_time_entry.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10))

end_time_label = ttk.Label(root, text="trimming video duration from the end (seconds):")
end_time_label.pack(fill=tk.BOTH, padx=10, pady=(10, 0))

end_time_var = tk.StringVar(value="0")
end_time_entry = ttk.Entry(root, textvariable=end_time_var)
end_time_entry.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10))

generate_selected_button = ttk.Button(root, text="Generate Selected Videos", command=generate_selected_videos)
generate_selected_button.pack(fill=tk.BOTH, padx=10, pady=(10, 0))

status_label = ttk.Label(root, text="", foreground="blue")
status_label.pack(fill=tk.BOTH, padx=10, pady=10)

ok_button = ttk.Button(root, text="OK", command=close_app)
root.protocol("WM_DELETE_WINDOW", close_app)

root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/926012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka--技术文档--spring-boot集成基础简单使用

阿丹: 查阅了很多资料了解到,使用了spring-boot中整合的kafka的使用是被封装好的。也就是说这些使用其实和在linux中的使用kafka代码的使用其实没有太大关系。但是逻辑是一样的。这点要注意! 使用spring-boot整合kafka 1、导入依赖 核心配…

【DEVOPS】Jenkins使用问题 - 控制台输出乱码

0. 目录 1. 问题描述2. 解决方案3. 最终效果4. 总结 1. 问题描述 部门内部对于Jenkins的使用采取的是Master Slave Work Node的方式,即作为Master节点的Jenkins只负责任务调度,具体的操作由对应的Slave Work Node去执行。 最近团队成员反馈一个问题&a…

高忆管理股票分析:1年期LPR下调10个基点 融资成本稳中有降

8月21日,中国人民银行授权全国银行间同业拆借中心发布,最新借款商场报价利率(LPR)为:1年期种类报3.45%,较上一期下降10个基点;5年期以上种类报4.20%,与前一期相等。 上海高忆私募基金(百度搜索高…

2023深圳智博会,正运动助力智能装备“更快更准”更智能!

■展会名称: 2023 深圳国际智能装备产业博览会暨深圳国际电子装备产业博览会(以下简称“EeIE 智博会”) ■展会日期 2023年8月29日-31日 ■展馆地点 深圳国际会展中心(宝安新馆) ■展位号 3B030 正运动技术,作为国内领先的…

C++动态规划DP Dynamic Programming实现B3635 硬币问题B3636 文字工作

DP动态规划的基本手段及如何解决问题 1. 那带一个问题,只要解决几个对应的小一点规模的问题就能得到问题本身的解 2. 设计一张表格,每一个格子都是一个问题的解 3. 一步步完成这张表格,根据一个数据,往表格前面的数据查找 4. …

APT80DQ40BG-ASEMI低功耗半导体APT80DQ40BG

编辑:ll APT80DQ40BG-ASEMI低功耗半导体APT80DQ40BG 型号:APT80DQ40BG 品牌:ASEMI 封装:TO-3P 恢复时间:>50ns 正向电流:80A 反向耐压:400V 芯片个数:2 引脚数量…

java八股文面试[JVM]——类加载器

一、类加载器的概念 类加载器是Java虚拟机用于加载类文件的一种机制。在Java中,每个类都由类加载器加载,并在运行时被创建为一个Class对象。类加载器负责从文件系统、网络或其他来源中加载类的字节码,并将其转换为可执行的Java对象。类加载器…

Kaniko在containerd中无特权快速构建并推送容器镜像

目录 一、kaniko是什么 二、kaniko工作原理 三、kanijo工作在Containerd上 基于serverless的考虑,我们选择了kaniko作为镜像打包工具,它是google提供了一种不需要特权就可以构建的docker镜像构建工具。 一、kaniko是什么 kaniko 是一种在容器或 Kube…

机器学习基础11-算法比较(基于印第安糖尿病Pima Indians 数据集)

比较不同算法的准确度,选择合适的算法,在处理机器学习的问题时是非常重要的。本节将介绍一种模式,在scikit-learn中可以利用它比较不同的算法,并选择合适的算法。你可以将这种模式作为自己的模板,来处理机器学习的问题…

如何备份系统?很简单,2个方法教会你!

在计算机使用过程中,系统故障、病毒攻击、意外损坏等问题可能导致数据丢失和系统无法正常运行。为了保障数据安全和系统稳定,如何备份系统是至关重要的。本文将介绍备份系统的2个方法,帮助用户轻松备份系统,确保数据的安全和系统的…

什么是网络中的服务质量 (QoS),其相关技术和关键指标有哪些?

QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制,是用来解决网络延迟和阻塞等问题的一种技术。QoS的保证对于容量有限的网络来…

MES管理系统解决方案,助力汽配企业打造透明化管理

随着汽车行业的不断发展,汽配行业面临着越来越严格的质量要求和生产效率提升挑战。为了满足这些需求,汽配企业需要实现生产过程的透明化和精细化。MES管理系统解决方案作为生产过程的核心管理系统,可以为汽配企业提供全面的解决方案&#xff…

ubuntu22.04安装搜狗输入法后始终无法输入中文

这次真的整我很久很久,我都不想用搜狗输入法了,结果无意间还是被我解决了。 ubuntu22.04安装搜狗输入法的步骤参考官网给的文档就行,这里我只说我的为啥输入不了中文 点击Fcitx配置 把搜狗输入法个人版放在第一位就行(我的系统语言是中文&am…

思维导图的作用有哪些?了解一下这几个作用

思维导图的作用有哪些?思维导图是一种以图形和颜色为主要表现形式的思维工具,它可以帮助人们更好地组织和表达思想。它的作用有很多,下面就给大家简单介绍一下。 1、帮助记忆 思维导图可以将大量信息整合到一个图形中,这有助于人…

一次由摔碎手机屏幕导致的急速搬家

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦midjourney 产品统筹 / bobo 想问问大家,都在什么情况下搬过家? 有的时候搬家是迫不得已,房东突然发难; 有的时候搬…

MyBatis分页插件PageHelper的使用及MyBatis的特殊符号---详细介绍

一,分页的概念 分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。在分页中,数据被分割成一定数量的页,每页显示一部分数据或内容,用户可以通过翻页或跳分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。…

深入浅出 RPC框架

RPC 框架分层设计 01 基本概念 1.1 本地函数调用 以上步骤只是为了说明原理。事实上编译器经常会做优化,对于参数和返回值少的情况会直接将其存放在寄存器,而不需要压栈弹栈的过程,甚至都不需要调用call,而直接做inline操作 1.2 远…

Forrester首次面向中国的开源报告:阿里云在云原生领域开源布局最全面

Forrester 于近期发布了《Navigate The Cloud-Native Ecosystem In China, 2023》,报告概述了中国云原生领域的开源项目对构建云原生生态的促进作用,这些开源项目正深刻影响着企业的技术决策者以何种策略拥抱云原生这一现代 IT 基础设施的核心。 报告表…

SMC状态机 讲解2 从模型到SMC

SMC状态机 讲解2 从模型到SMC 1、实例化有限状态机(FSM)2、简单转换 Simple Transition3、外部环回转换 External Loopback Transition4、内部环回转换 Internal Loopback Transition5、转换动作6、转换Guard7、转换参数8、Entry 和 Exit动作9、Push 转换10、Pop转换…

AI加持,创意设计效率百倍提升,探秘背后的数字化魔法

在当今创新潮流不断涌现的时代,人工智能正以惊人的速度和深度赋能各行各业,食品包装设计界也已来到了一个“拼创意、拼二创和拼审美”的时代。有了AI的加入,设计界正迎来一股AI创意风暴,不仅颠覆了设计流程,更为食品包…