从WebM到MP3:利用Python和wxPython提取音乐的魔法
前言
有没有遇到过这样的问题:你有一个包含多首歌曲的WebM视频文件,但你只想提取其中的每一首歌曲,并将它们保存为单独的MP3文件?这听起来可能有些复杂,但借助Python和几个强大的库,这个任务变得异常简单。今天,我将带你一步步实现这个小工具,并且给它取个有趣的名字:“魔法音乐分离器”。
C:\pythoncode\new\splitsongfromwebmintomp3.py
准备工作
在开始之前,确保你已经安装了以下Python库:
- wxPython:用于创建GUI界面。
- moviepy:用于处理视频文件。
- pydub:用于音频转换。
你可以通过以下命令安装这些库:
pip install wxPython moviepy pydub
此外,还需要安装并配置ffmpeg,这可以通过以下命令在命令行中测试是否安装正确:
ffmpeg -version
如果看到版本信息,说明ffmpeg已经正确安装。
完整代码:
import wx
import os
import subprocessclass MyFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='Music Extractor')panel = wx.Panel(self)self.vbox = wx.BoxSizer(wx.VERTICAL)self.file_picker = wx.FilePickerCtrl(panel, message="Choose a webm file")self.vbox.Add(self.file_picker, 0, wx.ALL | wx.EXPAND, 5)self.dir_picker = wx.DirPickerCtrl(panel, message="Choose a save directory")self.vbox.Add(self.dir_picker, 0, wx.ALL | wx.EXPAND, 5)self.memo = wx.TextCtrl(panel, style=wx.TE_MULTILINE, size=(400, 300))self.vbox.Add(self.memo, 1, wx.ALL | wx.EXPAND, 5)self.extract_button = wx.Button(panel, label='Extract Music')self.extract_button.Bind(wx.EVT_BUTTON, self.on_extract)self.vbox.Add(self.extract_button, 0, wx.ALL | wx.CENTER, 5)panel.SetSizer(self.vbox)self.Show()def on_extract(self, event):webm_path = self.file_picker.GetPath()save_dir = self.dir_picker.GetPath()memo_content = self.memo.GetValue()if not webm_path or not save_dir or not memo_content:wx.MessageBox('Please select a webm file, a save directory, and provide memo content.', 'Error', wx.OK | wx.ICON_ERROR)returntimestamps = self.parse_memo_content(memo_content)def hms_to_seconds(hms):h, m, s = map(int, hms.split(':'))return h * 3600 + m * 60 + sfor i in range(len(timestamps)):start_time = hms_to_seconds(timestamps[i][0])end_time = hms_to_seconds(timestamps[i+1][0]) if i+1 < len(timestamps) else Nonesong_name = timestamps[i][1]output_path = os.path.join(save_dir, f"{song_name}.mp3")if end_time:duration = end_time - start_timeffmpeg_command = ['ffmpeg', '-i', webm_path, '-ss', str(start_time),'-t', str(duration), '-q:a', '0', '-map', 'a', output_path]else:ffmpeg_command = ['ffmpeg', '-i', webm_path, '-ss', str(start_time),'-q:a', '0', '-map', 'a', output_path]subprocess.run(ffmpeg_command)wx.MessageBox('Extraction completed successfully!', 'Info', wx.OK | wx.ICON_INFORMATION)def parse_memo_content(self, content):lines = content.strip().split('\n')timestamps = []for line in lines:if line:parts = line.split(' - ')time_str = parts[0].strip('[]')song_name = parts[1]timestamps.append((time_str, song_name))return timestampsif __name__ == '__main__':app = wx.App(False)frame = MyFrame()app.MainLoop()
代码详解
创建GUI界面
首先,我们使用wxPython创建一个简单的GUI界面,包含文件选择器、路径选择器以及一个文本区域(memo组件)用于输入时间戳和歌曲信息。
import wx
import os
import subprocessclass MyFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='魔法音乐分离器')panel = wx.Panel(self)self.vbox = wx.BoxSizer(wx.VERTICAL)self.file_picker = wx.FilePickerCtrl(panel, message="选择一个WebM文件")self.vbox.Add(self.file_picker, 0, wx.ALL | wx.EXPAND, 5)self.dir_picker = wx.DirPickerCtrl(panel, message="选择保存路径")self.vbox.Add(self.dir_picker, 0, wx.ALL | wx.EXPAND, 5)self.memo = wx.TextCtrl(panel, style=wx.TE_MULTILINE, size=(400, 300))self.vbox.Add(self.memo, 1, wx.ALL | wx.EXPAND, 5)self.extract_button = wx.Button(panel, label='提取音乐')self.extract_button.Bind(wx.EVT_BUTTON, self.on_extract)self.vbox.Add(self.extract_button, 0, wx.ALL | wx.CENTER, 5)panel.SetSizer(self.vbox)self.Show()
提取音乐的魔法
接下来,我们需要在点击“提取音乐”按钮后进行实际的音频提取和转换。这里我们使用ffmpeg命令行工具来处理音频,因为它非常强大且灵活。
def on_extract(self, event):webm_path = self.file_picker.GetPath()save_dir = self.dir_picker.GetPath()memo_content = self.memo.GetValue()if not webm_path or not save_dir or not memo_content:wx.MessageBox('请选择一个WebM文件、保存路径,并提供memo内容。', '错误', wx.OK | wx.ICON_ERROR)returntimestamps = self.parse_memo_content(memo_content)def hms_to_seconds(hms):h, m, s = map(int, hms.split(':'))return h * 3600 + m * 60 + sfor i in range(len(timestamps)):start_time = hms_to_seconds(timestamps[i][0])end_time = hms_to_seconds(timestamps[i+1][0]) if i+1 < len(timestamps) else Nonesong_name = timestamps[i][1]output_path = os.path.join(save_dir, f"{song_name}.mp3")if end_time:duration = end_time - start_timeffmpeg_command = ['ffmpeg', '-i', webm_path, '-ss', str(start_time),'-t', str(duration), '-q:a', '0', '-map', 'a', output_path]else:ffmpeg_command = ['ffmpeg', '-i', webm_path, '-ss', str(start_time),'-q:a', '0', '-map', 'a', output_path]subprocess.run(ffmpeg_command)wx.MessageBox('提取完成!', '信息', wx.OK | wx.ICON_INFORMATION)def parse_memo_content(self, content):lines = content.strip().split('\n')timestamps = []for line in lines:if line:parts = line.split(' - ')time_str = parts[0].strip('[]')song_name = parts[1]timestamps.append((time_str, song_name))return timestamps
解析memo内容
我们需要将memo中的内容解析成时间戳和歌曲信息的列表。这里我们定义了一个parse_memo_content方法来处理这个任务。
def parse_memo_content(self, content):lines = content.strip().split('\n')timestamps = []for line in lines:if line:parts = line.split(' - ')time_str = parts[0].strip('[]')song_name = parts[1]timestamps.append((time_str, song_name))return timestamps
主程序入口
最后,我们定义主程序入口,启动wxPython应用。
if __name__ == '__main__':app = wx.App(False)frame = MyFrame()app.MainLoop()
界面:

结果:

结语
至此,我们的“魔法音乐分离器”已经完成。你可以通过简单的图形界面选择一个包含多首歌曲的WebM文件,指定保存路径,并输入时间戳和歌曲信息,程序会自动提取每一首歌曲并保存为MP3文件。
希望这个小工具能为你的音乐提取工作带来便利。如果你有任何问题或建议,欢迎留言讨论!
相关文章:
从WebM到MP3:利用Python和wxPython提取音乐的魔法
前言 有没有遇到过这样的问题:你有一个包含多首歌曲的WebM视频文件,但你只想提取其中的每一首歌曲,并将它们保存为单独的MP3文件?这听起来可能有些复杂,但借助Python和几个强大的库,这个任务变得异常简单。…...
图片转pdf,图片转pdf在线转换,在线图片转pdf
图片转PDF,听起来似乎是一个简单的操作,但实际上,它涉及到许多细节和技巧。有时候我们需要将图片转换为PDF格式,以便于分享、打印或保存。那么,如何将图片转换成PDF呢?接下来,我将为您详细介绍几…...
SpringBoot3使用Swagger3
SpringBoot3使用Swagger3 项目中的后端接口进行简单的前端展示一、依赖引入二、快速启动1.在application.yml中配置2.或者properties文件,则配置3.启动项目访问swagger 三、使用注解标注接口Swagger配置文件Swagger 注解迁移举例五种常用ApiApiOperationApiImplicitParamApiMod…...
【51单片机基础教程】点亮led
文章目录 前言51单片机点亮LED的原理硬件部分软件部分51单片机的寄存器编程步骤proteus仿真点亮一个led 点亮多个ledproteus仿真代码 流水灯 总结 前言 单片机(Microcontroller Unit, MCU)是一种集成电路,广泛应用于各种电子产品中。作为嵌入…...
Docker之overlay2的迁移
原因 docker默认将文件及其容器放置在了系统盘的挂载区内,如果长期使用会发现系统挂载区被overlay2挤爆了,因此在一开始我们将其迁移在大容量外挂磁盘上,就可以避免系统盘被挤爆,放心使用. 具体操作 # 停止容器 systemctl stop docker# 修改容器配置,…...
CentOS中的rename命令
目录 CentOS中的rename命令基本语法使用示例注意事项安装prename CentOS中的rename命令 在CentOS系统中,rename命令通常是指util-linux包中提供的版本,它用于批量重命名文件,但与Perl版本的rename命令相比,功能较为简单ÿ…...
redis.conf 参数详解,方便进行性能优化配置
以下是redis.conf中一些常见参数的详细说明: daemonize:是否以后台进程运行,默认为no; pidfile:如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid;bind:绑定主…...
微信小程序登录流程详情及Java代码
一、流程图 说明: 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 获取手机号,调用wx.getPhoneNumber() ,获取加密…...
c++qt合并两张灰度图像
需求:将两张尺寸相同的灰度图像进行合并,合并后的图像,每个像素点灰度值为两张原图对应像素点灰度值之和。若超过255,则最大为255。 方法一: 将图像读取为cv::Mat,再调用opencv的cv::add方法,进…...
Uniapp通过年月日时间转变星期格式
效果图 参靠微信小程序:日常记一记 代码 <view v-for"(d,index) in dataList" >{{getWeekDay(d.ctime)}} //时间格式:2024-06-21</view> js export default {data(){return {dataList:[],//时间数组}},onLoad() {this.loadList…...
如何编写和执行高效的测试计划
如何编写和执行高效的测试计划 1. 测试计划概述2. 测试阶段详解3. 测试计划模板4. 关键注意事项总结 1. 测试计划概述 测试计划是指导整个测试过程的重要文档,其中包含了测试策略、资源分配、进度安排以及风险评估等内容。 一个完善的测试计划应当包括以下几个主要…...
【MySQL连接器(Python)指南】03-MySQL连接器(Python)安装
文章目录 前言1. 从二进制发行版中安装连接器1.1 使用pip安装MySQL连接器1.2 使用MySQL Yum Repository安装1.3 使用Debian软件包安装连接器2. 从源代码发行版安装连接器2.1 在Windows上源码安装2.2 在类Unix系统上源码安装3. 验证连接器安装总结前言 MySQL连接器(Python),用于…...
Spring Boot组件化与参数校验
Spring Boot组件化与参数校验 Spring Boot版本选择 2.3.x版本 2.6.x版本 Spring Boot核心思想 约定大于配置,简化繁琐的配置 Spring Boot自动配置原理 SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,Spr…...
实现可扩展的电商返利平台:技术选型与挑战
实现可扩展的电商返利平台:技术选型与挑战 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在当今数字化和电商兴盛的时代,返利平台成为…...
从0开始C++(三):构造函数与析构函数详解
目录 构造函数 构造函数的基本使用 构造函数也支持函数重载 构造函数也支持函数参数默认值 构造初始化列表 拷贝构造函数 浅拷贝和深拷贝 析构函数 总结 练习一下ヽ( ̄▽ ̄)ノ 构造函数 构造函数的基本使用 构造函数是一种特殊的成…...
行车记录仪文件夹“0字节”现象解析与恢复策略
一、行车记录仪文件夹“0字节”现象描述 行车记录仪作为现代驾驶中的必备设备,其储存的视频数据对于事故记录和取证至关重要。然而,有时车主们可能会遇到这样一个问题:行车记录仪的某个文件夹内的文件突然变成了0字节大小,无法正…...
呼叫中心系统的功能都有哪些?okcc呼叫中心pscc磐石云呼叫系统部署
当前电话营销普及到各行各业,方便快捷成了大部分企业在宣传自己公司的产品时必用的一种营销方式,但是电话营销在管理上也存在许多问题。例如:销售员与客户沟通前,未能详细了解客户的资料;多名销售员重复拨打同一个客户…...
2024.06.08校招 实习 内推 面经
绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、提前批 | 中电锦江2025届提前批招聘 提前批 | 中电锦江2025届提前批招聘 2、实习 | 国电电力2025届暑期实习生计划启动! 实习 | 国电电力2025届暑期实习生计划启动&#x…...
Polyplus——转染试剂专业供应商
PolyPlus-transfection是一家专业的转染试剂研发和生产的生物技术公司,拥有20年的的转染试剂研发经验,通过创新的核酸转染解决方案支持基因和细胞治疗、生物制剂制造和生命科学研究。目前已经通过了ISO 9001: 2000质量体系认证,已经开发了一系…...
微服务架构-线上治理、线下治理与架构演进
目录 一、线上治理 1.1 概述 1.2 线上预案体系 1.2.1 概述 1.2.2 变更引起的故障 1.2.3 流量和容量变化引起的故障 1.2.4 依赖故障 1.2.5 机房、网络等硬件和环境故障 1.2.6 其他 1.2.7 故障的场景化 1.3 基于Metric的预案自动触发 1.4 治理参数动态调整 1.4.1 举例…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
