音频/视频提取器:Python和moviepy实现

在这篇博客中,我们将深入探讨一个使用Python和wxPython构建的音频/视频提取器应用程序。这个应用程序允许用户从视频文件中提取音频,或者从音频文件中截取特定时间段。让我们逐步分析这个程序的功能和实现。
C:\pythoncode\new\MP3towav.py

全部代码

import wx
import os
import subprocess
from datetime import datetime
import json
from moviepy.editor import VideoFileClip, AudioFileClipclass AudioVideoExtractor(wx.Frame):def __init__(self):super().__init__(parent=None, title='Audio/Video Extractor')self.panel = wx.Panel(self)self.create_widgets()self.load_settings()def create_widgets(self):# File selectionself.file_picker = wx.FilePickerCtrl(self.panel, message="Choose an audio or video file")# Time rangeself.start_time = wx.TextCtrl(self.panel, value="00:00:00")self.end_time = wx.TextCtrl(self.panel, value="00:00:00")# Output formatself.formats = ['mp3', 'wav', 'aac']self.format_choice = wx.Choice(self.panel, choices=self.formats)# Output directoryself.dir_picker = wx.DirPickerCtrl(self.panel, message="Choose output directory")# Export buttonself.export_btn = wx.Button(self.panel, label="Export")self.export_btn.Bind(wx.EVT_BUTTON, self.on_export)# Open buttonself.open_btn = wx.Button(self.panel, label="Open in PotPlayer")self.open_btn.Bind(wx.EVT_BUTTON, self.on_open)# Layoutsizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(wx.StaticText(self.panel, label="Select Audio or Video File:"), 0, wx.ALL, 5)sizer.Add(self.file_picker, 0, wx.EXPAND|wx.ALL, 5)sizer.Add(wx.StaticText(self.panel, label="Start Time (HH:MM:SS):"), 0, wx.ALL, 5)sizer.Add(self.start_time, 0, wx.EXPAND|wx.ALL, 5)sizer.Add(wx.StaticText(self.panel, label="End Time (HH:MM:SS):"), 0, wx.ALL, 5)sizer.Add(self.end_time, 0, wx.EXPAND|wx.ALL, 5)sizer.Add(wx.StaticText(self.panel, label="Output Format:"), 0, wx.ALL, 5)sizer.Add(self.format_choice, 0, wx.EXPAND|wx.ALL, 5)sizer.Add(wx.StaticText(self.panel, label="Output Directory:"), 0, wx.ALL, 5)sizer.Add(self.dir_picker, 0, wx.EXPAND|wx.ALL, 5)sizer.Add(self.export_btn, 0, wx.ALL|wx.CENTER, 5)sizer.Add(self.open_btn, 0, wx.ALL|wx.CENTER, 5)self.panel.SetSizer(sizer)def on_export(self, event):input_path = self.file_picker.GetPath()start_time = self.start_time.GetValue()end_time = self.end_time.GetValue()output_format = self.formats[self.format_choice.GetSelection()]output_dir = self.dir_picker.GetPath()if not all([input_path, start_time, end_time, output_format, output_dir]):wx.MessageBox("Please fill in all fields", "Error", wx.OK | wx.ICON_ERROR)returntry:# Check if the input file is video or audiofile_extension = os.path.splitext(input_path)[1].lower()if file_extension in ['.mp4', '.avi', '.mov', '.flv']:  # Add more video extensions if neededclip = VideoFileClip(input_path).audioelif file_extension in ['.mp3', '.wav', '.aac', '.flac']:  # Add more audio extensions if neededclip = AudioFileClip(input_path)else:raise ValueError("Unsupported file format")start = self.time_to_seconds(start_time)end = self.time_to_seconds(end_time)clip = clip.subclip(start, end)timestamp = datetime.now().strftime("%Y%m%d")counter = 1while True:output_filename = f"{timestamp}_{counter:03d}.{output_format}"output_path = os.path.join(output_dir, output_filename)if not os.path.exists(output_path):breakcounter += 1clip.write_audiofile(output_path)clip.close()self.last_exported_file = output_pathwx.MessageBox(f"Audio exported to {output_path}", "Success", wx.OK | wx.ICON_INFORMATION)self.save_settings()except Exception as e:wx.MessageBox(f"Error: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)def on_open(self, event):if hasattr(self, 'last_exported_file') and os.path.exists(self.last_exported_file):try:subprocess.Popen(['C:\\Program Files\\DAUM\\PotPlayer\\PotPlayerMini64.exe', self.last_exported_file])except Exception as e:wx.MessageBox(f"Error opening file: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)else:wx.MessageBox("No file has been exported yet", "Error", wx.OK | wx.ICON_ERROR)def time_to_seconds(self, time_str):h, m, s = map(int, time_str.split(':'))return h * 3600 + m * 60 + sdef save_settings(self):settings = {'last_file': self.file_picker.GetPath(),'start_time': self.start_time.GetValue(),'end_time': self.end_time.GetValue(),'format': self.format_choice.GetSelection(),'output_dir': self.dir_picker.GetPath()}with open('settings.json', 'w') as f:json.dump(settings, f)def load_settings(self):if os.path.exists('settings.json'):with open('settings.json', 'r') as f:settings = json.load(f)self.file_picker.SetPath(settings.get('last_file', ''))self.start_time.SetValue(settings.get('start_time', '00:00:00'))self.end_time.SetValue(settings.get('end_time', '00:00:00'))self.format_choice.SetSelection(settings.get('format', 0))self.dir_picker.SetPath(settings.get('output_dir', ''))if __name__ == '__main__':app = wx.App()frame = AudioVideoExtractor()frame.Show()app.MainLoop()

1. 概述

这个应用程序的主要功能包括:

  • 从视频文件中提取音频
  • 从音频文件中截取特定时间段
  • 设置输出音频格式
  • 自定义输出文件名和路径
  • 使用PotPlayer播放导出的音频文件
  • 保存和加载用户设置

2. 导入必要的库

import wx
import os
import subprocess
from datetime import datetime
import json
from moviepy.editor import VideoFileClip, AudioFileClip

这些库为我们提供了以下功能:

  • wx: 用于创建图形用户界面
  • os: 用于文件和路径操作
  • subprocess: 用于启动外部程序(PotPlayer)
  • datetime: 用于生成时间戳
  • json: 用于保存和加载设置
  • moviepy.editor: 用于处理音频和视频文件

3. 主应用程序类

class AudioVideoExtractor(wx.Frame):def __init__(self):super().__init__(parent=None, title='Audio/Video Extractor')self.panel = wx.Panel(self)self.create_widgets()self.load_settings()

这个类继承自wx.Frame,是我们应用程序的主窗口。在初始化方法中,我们创建了一个面板,调用方法来创建UI组件,并加载之前保存的设置。

4. 创建UI组件

def create_widgets(self):# 文件选择器self.file_picker = wx.FilePickerCtrl(self.panel, message="Choose an audio or video file")# 时间范围输入self.start_time = wx.TextCtrl(self.panel, value="00:00:00")self.end_time = wx.TextCtrl(self.panel, value="00:00:00")# 输出格式选择self.formats = ['mp3', 'wav', 'aac']self.format_choice = wx.Choice(self.panel, choices=self.formats)# 输出目录选择self.dir_picker = wx.DirPickerCtrl(self.panel, message="Choose output directory")# 导出按钮self.export_btn = wx.Button(self.panel, label="Export")self.export_btn.Bind(wx.EVT_BUTTON, self.on_export)# 打开按钮self.open_btn = wx.Button(self.panel, label="Open in PotPlayer")self.open_btn.Bind(wx.EVT_BUTTON, self.on_open)# 布局设置# ...

这个方法创建了所有的UI组件,包括文件选择器、时间输入框、格式选择下拉框、目录选择器和按钮。它还设置了组件的布局。

5. 导出功能

def on_export(self, event):# 获取用户输入input_path = self.file_picker.GetPath()start_time = self.start_time.GetValue()end_time = self.end_time.GetValue()output_format = self.formats[self.format_choice.GetSelection()]output_dir = self.dir_picker.GetPath()# 检查输入是否完整if not all([input_path, start_time, end_time, output_format, output_dir]):wx.MessageBox("Please fill in all fields", "Error", wx.OK | wx.ICON_ERROR)returntry:# 检查输入文件类型file_extension = os.path.splitext(input_path)[1].lower()if file_extension in ['.mp4', '.avi', '.mov', '.flv']:clip = VideoFileClip(input_path).audioelif file_extension in ['.mp3', '.wav', '.aac', '.flac']:clip = AudioFileClip(input_path)else:raise ValueError("Unsupported file format")# 处理音频start = self.time_to_seconds(start_time)end = self.time_to_seconds(end_time)clip = clip.subclip(start, end)# 生成输出文件名timestamp = datetime.now().strftime("%Y%m%d")counter = 1while True:output_filename = f"{timestamp}_{counter:03d}.{output_format}"output_path = os.path.join(output_dir, output_filename)if not os.path.exists(output_path):breakcounter += 1# 导出音频clip.write_audiofile(output_path)clip.close()self.last_exported_file = output_pathwx.MessageBox(f"Audio exported to {output_path}", "Success", wx.OK | wx.ICON_INFORMATION)self.save_settings()except Exception as e:wx.MessageBox(f"Error: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)

这个方法是程序的核心,它处理音频/视频的导出过程:

  1. 获取用户输入的所有必要信息。
  2. 检查输入文件的类型(音频或视频)。
  3. 根据用户指定的时间范围截取音频。
  4. 生成一个唯一的输出文件名。
  5. 导出音频文件。
  6. 保存用户设置以便下次使用。

6. 在PotPlayer中打开文件

def on_open(self, event):if hasattr(self, 'last_exported_file') and os.path.exists(self.last_exported_file):try:subprocess.Popen(['potplayer.exe', self.last_exported_file])except Exception as e:wx.MessageBox(f"Error opening file: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)else:wx.MessageBox("No file has been exported yet", "Error", wx.OK | wx.ICON_ERROR)

这个方法允许用户直接在PotPlayer中打开最近导出的文件。

7. 设置的保存和加载

def save_settings(self):settings = {'last_file': self.file_picker.GetPath(),'start_time': self.start_time.GetValue(),'end_time': self.end_time.GetValue(),'format': self.format_choice.GetSelection(),'output_dir': self.dir_picker.GetPath()}with open('settings.json', 'w') as f:json.dump(settings, f)def load_settings(self):if os.path.exists('settings.json'):with open('settings.json', 'r') as f:settings = json.load(f)self.file_picker.SetPath(settings.get('last_file', ''))self.start_time.SetValue(settings.get('start_time', '00:00:00'))self.end_time.SetValue(settings.get('end_time', '00:00:00'))self.format_choice.SetSelection(settings.get('format', 0))self.dir_picker.SetPath(settings.get('output_dir', ''))

这些方法允许程序保存用户的设置并在下次启动时加载它们,提高了用户体验。

8. 主程序入口

if __name__ == '__main__':app = wx.App()frame = AudioVideoExtractor()frame.Show()app.MainLoop()

这是程序的入口点,它创建了wxPython应用程序实例,实例化了我们的AudioVideoExtractor类,并启动主事件循环。

运行结果

在这里插入图片描述

结论

这个音频/视频提取器是一个功能强大yet易用的工具,展示了如何使用Python和wxPython创建实用的桌面应用程序。它结合了文件I/O、音频/视频处理、GUI编程和设置管理等多个方面,是一个很好的学习案例。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue day06(路由进阶)

一、路由进阶 1. 路由模块封装 所有的路由配置都堆在main.js里不合适,将路由模块提取出来,利于维护 放到 src / router 文件夹下 的 index.js 2. 声明式导航 / 声明式导航传参(查询参数传参&动态路由传参) 声明式导航…

6.2 URDF集成Rviz基本流程

前面介绍过,URDF 不能单独使用,需要结合 Rviz 或 Gazebo,URDF 只是一个文件,需要在 Rviz 或 Gazebo 中渲染成图形化的机器人模型,当前,首先演示URDF与Rviz的集成使用,因为URDF与Rviz的集成较之于…

Java进阶之路:构造方法

🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝 🥇博主昵称:小菜元 🍟博客主页…

Javascript算法——二分查找

1.数组 1.1二分查找 1.搜索索引 开闭matters!!![left,right]与[left,right) /*** param {number[]} nums* param {number} target* return {number}*/ var search function(nums, target) {let left0;let rightnums.length-1;//[left,rig…

波浪理论(Elliott Wave Theory)

拉尔夫纳尔逊艾略特 拉尔夫纳尔逊艾略特(1871年07月28日-1948年01月15日),1871年7月28日出生在美国堪萨斯州的玛丽斯维利镇,是一名杰出的会计师,作家及金融市场分析大师,以其著名的波浪理论而留名于世。 波…

ubuntu 安装 MySql5.7(基于ARM架构 源码安装)

1 系统需求 目标安装MySql5.7版本。 系统环境: oracle云主机,arm架构 确认主机架构如下图: 查看是否有5.7版本的源 apt-cache search mysql | grep mysql-server 执行后发现只有8.0版本的,5.7版本只能通过源码安装了。 2 下载MySql源码…

MATLAB边缘检测

一、目的: 熟悉边缘检测原理,并运用matlab软件实现图像的canny边缘检测,体会canny边缘检测的优缺点。 二、内容: 编写matlab程序,实现对lena图像的边缘检测,输出程序运行结果。 三、原理或步骤&#x…

多线程(七):单例模式指令重排序

目录 1. 单例模式 1.1 饿汉模式 1.2 懒汉模式 2. 懒汉模式下的问题 2.1 线程安全问题 2.2 如何解决 --- 加锁 2.3 加锁引入的新问题 --- 性能问题 2.4 指令重排序问题 2.4.1 指令重排序 2.4.2 指令重排序引发的问题 1. 单例模式 单例模式, 是设计模式中最典型的一种模…

VMware:Windows主机与CentOS虚拟机文件互传文件共享

注意:本文使用Win10与VMware17pro互传 1. 本地创建文件夹 如下图创建一个文件夹,名字任意 2. 设置本地文件夹权限 右键文件夹 - - 属性 - - 共享 - - 高级共享 - - 权限 - - 如下图全部勾选 - - 应用 - - 确认 3. VMware中设置共享文件夹路径 第一步…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式: 在当今信息爆炸的时代,如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…

【动态规划】【路径问题】下降路经最小和、最小路径和、地下城游戏

4. 下降路径最小和 931. 下降路径最小和 算法原理 确定状态表示 dp[i][j] 表示:到达 [i, j] 位置,最小的下降路径 状态转移方程 dp[i][j] 从 [i-1, j-1] 到达 [i, j] > dp[i-1][j-1] m[i][j]从 [i-1, j] 到达 [i, j] > dp[i-1][j] m[i][j]从 …

已解决:ModuleNotFoundError: No module named ‘pip‘

[已解决] ModuleNotFoundError: No module named ‘pip‘ 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 手动安装或升级 pip2. 使用 get-pip.py 脚本3. 检查环境变量配置4. 重新安装 Python 并确保添加到 PATH5. 在虚拟环境中安装 pip6. 使用 conda 安装 pip&…

智简魔方业务管理系统v10 好用的IDC业务管理软件

智简魔方业务管理系统v10,您一直在寻找的IDC业务管理软件,基于PHPMYSQL开发的一套小型易于部署的业务管理核心,具有极强的扩展能力,非常方便的安装方式,用户可在5分钟内部署属于自己的业务管理系统,ZJMF-CB…

路由表来源(基于华为模拟器eNSP)

概叙 在交换网络中,若要实现不同网段之间的通信,需要依靠三层设备(路由器、三层交换机等),而路由器只知道其直连网段的路由条目,对于非直连的网段,在默认情况下,路由器是不可达的&a…

Goland 搭建Gin脚手架

一、使用编辑器goland 搭建gin 打开编辑器 新建项目后 点击 create 二、获得Gin框架的代码 命令行安装 go get -u github.com/gin-gonic/gin 如果安装不上,配置一下环境 下载完成 官网git上下载 这样就下载完成了。、 不过这种方法需要设置一下GOPATH 然后再执…

【An】Animate 2024 for【Mac】 An动画设计制作软件 安装教程——保姆级教程

Mac分享吧 文章目录 【An】Animate 2024 Mac版 An动画设计制作软件 安装完成,打开效果Mac电脑【An】Animate 2024 动画设计制作软件——v24.0.4⚠️注意事项:1️⃣:下载软件2️⃣:安装AntiCC组件,步骤见文章或下图3️…

springboot+uinapp基于Android的固定资产借用管理平台

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图论文效果图 前言 文章底部名片,获取项目的完整演示视频,免费解答技术疑问 项目介绍 固定资产借用管理平台设计的目的是为用户提供使用申请、故障报修、设备归还、意见反馈等管理方…

嘉立创EDA个人学习笔记2(绘制51单片机核心板)

前言 本篇文章属于嘉立创EDA的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 【教程】零基础入门PCB设计-国一学长带你学立创EDA专业版 全程保姆…

新手入门之Spring Bean

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、初识SpringBootSpringBoot 的主要特点1、自动配置:2、外部化配置:3、嵌入式服务器支持:4、启动器依赖(Start…