视频分割合并工具说明
使用说明书:视频分割合并工具
欢迎使用视频生成工具!本工具旨在帮助您将视频文件按照指定的规则分割并合并,以生成您所需的视频。
本程序还自带提高分辨率1920:1080,以及增加10db声音的功能
软件下载地址
https://github.com/cmdch2017/-python-
步骤1:选择视频文件
- 点击 “Select Multiple Input Files” 按钮,选择您要处理的视频文件。您可以同时选择多个视频文件。
- 选择的文件将会显示在下方的文件列表中。
步骤2:设置分割和合并规则
- 在 “Segment Interval (seconds):” 文本框中,输入希望分割视频的时间间隔(以秒为单位)。例如,若要每隔5分钟分割一次,输入300。
- 在 “Segment Duration (seconds):” 文本框中,输入每个分割片段的持续时间(以秒为单位)。例如,若希望每个片段为30秒,输入30。
- 在 “Start Time (seconds):” 文本框中,输入每个分割片段的起始时间(以秒为单位)。
- 在 “End Time (seconds):” 文本框中,输入每个分割片段的结束时间(以秒为单位)。
步骤3:生成视频
- 点击 “Generate Selected Videos” 按钮,工具将会按照您的设置生成分割后的视频。
- 在生成的过程中,工具将在状态栏中显示当前进度。
步骤4:保存生成的视频
- 生成完成后,工具将在指定的输出文件夹中保存生成的视频文件。
- 输出文件的命名规则为 “merged_output.mp4”,若有重名文件,将会自动添加编号。
步骤5:找到视频文件
- 生成的视频放在软件目录的output_videos文件夹下。
注意事项
- 本工具依赖于 FFmpeg 库进行视频处理,请确保您的电脑已安装 FFmpeg。
- 请确保您选择的视频文件格式为 MP4 格式。
联系我们
如有任何问题或建议,请随时联系我们:congminglst@163.com
或者评论区直接提问,如果对您有帮助,请点个赞谢谢
源代码
import subprocess
import os
import tkinter as tk
from tkinter import ttk, filedialog
from ttkthemes import ThemedStyledef 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_durationoutput_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 concatenationvalid_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 = 1merged_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 += 1concat_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_outputdef 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()
相关文章:

视频分割合并工具说明
使用说明书:视频分割合并工具 欢迎使用视频生成工具!本工具旨在帮助您将视频文件按照指定的规则分割并合并,以生成您所需的视频。 本程序还自带提高分辨率1920:1080,以及增加10db声音的功能 软件下载地址 https://github.com/c…...

2023java面试深入探析Nginx的处理流程
推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 史上最全文档AI绘画stablediffusion资料分享 「java、python面试题」来自UC网盘app分享,打开手…...

Java的锁大全
Java的锁 各种锁的类型 乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。 先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数…...

Leetcode80. 删除有序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 class Solu…...

电脑显示“Operating System not found”该怎么办?
“Operating System not found”是一种常见的电脑错误提示,这类错误会导致你无法成功启动Windows。那么电脑显示“Operating System not found”该怎么办呢? 方法1. 检查硬盘 首先,您可以测试硬盘是否存在问题。为此,您可以采取以…...

简析SCTP开发指南
目录 前言一、SCTP基本概念二、SCTP开发步骤1. **环境配置**:2. **建立Socket**:3. **绑定和监听**:4. **接收和发送数据**:5. **关闭连接**: 三、 C语言实现SCTP3.1SCTP客户端代码:3.2 SCTP服务器端代码&a…...

把Android手机变成电脑摄像头
一、使用 DroidCam 使用 DroidCam,你可以将手机作为电脑摄像头和麦克风。一则省钱,二则可以在紧急情况下使用,比如要在电脑端参加一个紧急会议,但电脑却没有摄像头和麦克风。 DroidCam 的安卓端分为免费的 DroidCam 版和收费的 …...

Linux线程篇(中)
有了之前对线程的初步了解我们学习了什么是线程,线程的原理及其控制。这篇文章将继续讲解关于线程的内容以及重要的知识点。 线程的优缺点: 线程的缺点 在这里我们来谈一谈线程健壮性: 首先我们先思考一个问题,如果一个线程出现…...

深度学习优化入门:Momentum、RMSProp 和 Adam
目录 深度学习优化入门:Momentum、RMSProp 和 Adam 病态曲率 1牛顿法 2 Momentum:动量 3Adam 深度学习优化入门:Momentum、RMSProp 和 Adam 本文,我们讨论一个困扰神经网络训练的问题,病态曲率。 虽然局部极小值和鞍点会阻碍…...

LeetCode 面试题 01.09. 字符串轮转
文章目录 一、题目二、C# 题解 一、题目 字符串轮转。给定两个字符串 s1 和 s2,请编写代码检查 s2 是否为 s1 旋转而成(比如,waterbottle 是 erbottlewat 旋转后的字符串)。 点击此处跳转题目。 示例1: 输入:s1 “wa…...

系统上线安全测评需要做哪些内容?
电力信息系统、航空航天、交通运输、银行金融、地图绘画、政府官网等系统再正式上线前需要做安全测试。避免造成数据泄露从而引起的各种严重问题。 那么系统上线前需要做哪些测试内容呢?下面由我给大家介绍 1、安全机制检测-应用安全 身份鉴别 登录控制模块 应提供…...

vue 中 axios 的安装及使用
vue 中 axios 的安装及使用 1. axios 安装2. axios使用 1. axios 安装 首先,打开当前的项目终端,输入 npm install axios --save-dev验证是否安装成功,检查项目根目录下的 package.json,其中的 devDependencies 里面会多出一个axios及其版本…...

数据结构——线性数据结构(数组,链表,栈,队列)
文章目录 1. 数组2. 链表2.1. 链表简介2.2. 链表分类2.2.1. 单链表2.2.2. 循环链表2.2.3. 双向链表2.2.4. 双向循环链表 2.3. 应用场景2.4. 数组 vs 链表 3. 栈3.1. 栈简介3.2. 栈的常见应用常见应用场景3.2.1. 实现浏览器的回退和前进功能3.2.2. 检查符号是否成对出现3.2.3. 反…...

多态(C++)
多态 一、初识多态概念“登场”1>. 多态的构成条件2>. 虚函数3>. 虚函数重写(覆盖)4>. 虚函数重写的两个例外1. 协变 一 基类和派生类虚函数返回值类型不同2. 析构函数重写(基类和派生类析构函数名不同) 小结 二、延伸…...

算法leetcode|73. 矩阵置零(rust重拳出击)
文章目录 73. 矩阵置零:样例 1:样例 2:提示:进阶: 分析:题解:rust:go:c:python:java: 73. 矩阵置零: 给定一个 m x n 的矩…...

axios 二次封装
axios 二次封装 基本上每一个项目开发,都必须要二次封装 axios。主要是为了减少重复性工作,不可能每一次发起新请求时,都要重新配置请求域名、请求头 Content-Type、Token 等信息。所以需要把公用的部分都封装成一个函数,每次调用…...

Rust安全之数值
文章目录 数值溢出 数值溢出 编译通过,运行失败 cargo run 1 fn main() {let mut arg std::env::args().skip(1).map(|x| x.parse::<i32>().unwrap()).next().unwrap();let m_i i32::MAX - 1;let a m_i arg;println!("{:?}", a); }thread main panicked…...

4种方法实现html 页面内锚点定位及跳转
使用scrollIntoView进行锚点定位效果 不知道你有没有遇到这样的需求:锚点定位?进入页面某个元素需要出现在可视区?…这一类的需求归根结底就是处理元素与可视区域的关系。我接触了很多前端小伙伴,实现的方式有各种各样的ÿ…...

gitlab配置备忘
版本 gitlab 14.6.2 gitlab备份上传到阿里云oss ### Backup Settings ###! Docs: https://docs.gitlab.com/omnibus/settings/backups.html# gitlab_rails[manage_backup_path] true # gitlab_rails[backup_path] "/var/opt/gitlab/backups"###! Docs: https://…...

基于Centos搭建k8s仓库
系统环境: Red Hat Enterprise Linux 9.1 (Plow) Kernel: Linux 5.14.0-162.6.1.el9_1.x86_64 主机名地址master192.168.19.128node01192.168.19.129node02192.168.19.130 目录 1、关闭防火墙,关闭SElinxu ,开启时间同步服务 2、关…...

浅谈泛在电力物联网发展形态与技术挑战
安科瑞 华楠 摘 要:泛在电力物联网是当前智能电网发展的一个方向。首先,总结了泛在电力物联网的主要作用和价值体现;其次,从智能电网各个环节概述了物联网技术在电力领域的已有研究和应用基础;进而,构思并…...

git reset --soft 用法
git reset --soft 是 Git 命令中的一个选项,它用于取消之前的提交,并将取消的更改保留在暂存区。这允许您重新组织提交历史或将更改合并到一个新的提交中,而不影响暂存区和工作目录中的更改。 这个命令的语法是: git reset --so…...

哪些测试仪器可以用于检测静电中和设备的性能
静电设备性能测试通常需要使用一些专门的仪器来进行。以下是一些常见的静电设备性能测试仪器: 1. 静电电压测试仪:用于测量物体表面的静电电压。它通常可以测量正负电压,并具有高精度和快速响应的特点。 2. 静电电荷仪:用于测量物…...

浅析 GlusterFS 与 JuiceFS 的架构异同
在进行分布式文件存储解决方案的选型时,GlusterFS 无疑是一个不可忽视的考虑对象。作为一款开源的软件定义分布式存储解决方案,GlusterFS 能够在单个集群中支持高达 PiB 级别的数据存储。自从首次发布以来,已经有超过十年的发展历程。目前&am…...

ARM开发,stm32mp157a-A7核PWM实验(驱动蜂鸣器,风扇,马达工作)
1.分析框图; 2.比较捕获寄存器(产生PWM方波); 工作原理: 1、系统提供一个时钟源209MHZ,需要通过分频器进行分频,设置分频器值为209分频; 2、当定时器启动之后,自动重载…...

群狼调研(长沙眼镜店神秘顾客)|消费者需求研究方案
本文由群狼调研(长沙品牌调研)出品,欢迎转载,请注明出处。消费者需求研究方案是在开展研究之前制定的计划,用于指导研究的设计、实施和分析。以下是一个可能的消费者需求研究方案的大致框架: 1. 研究目标和问题: • …...

电脑入门:宽带路由器常见故障排除技巧
宽带路由器在企业网络中的应用是相当广泛的,在运行的过程中出现故障是在所难免的,虽然故障现象多种多样,引起故障发生的原因也不尽相同,但从大体上可以把这些故障分为硬件故障和软件故障,具体来说就是一些网络连接性问题、配置文件选项问题以及网络协议问题等。 由于路由器…...

基于云原生网关的流量防护实践
作者:涂鸦 背景 在分布式系统架构中,每个请求都会经过很多层处理,比如从入口网关再到 Web Server 再到服务之间的调用,再到服务访问缓存或 DB 等存储。在下图流量防护体系中,我们通常遵循流量漏斗原则进行流量防护。…...

开源与云计算:新的合作模式
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

前端需要理解的跨平台知识
混合开发是指使用多种开发模开发App的一种开发模式,涉及到两大类技术:原生 Native、Web H5。原生 Native 主要指 iOS(Objective C)、Android(Java),原生开发效率较低,开发完成需要重…...