从WebM到MP3:利用Python和wxPython提取音乐的魔法

news2024/11/24 17:54:10

前言

有没有遇到过这样的问题:你有一个包含多首歌曲的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 subprocess

class 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)
            return

        timestamps = self.parse_memo_content(memo_content)

        def hms_to_seconds(hms):
            h, m, s = map(int, hms.split(':'))
            return h * 3600 + m * 60 + s

        for 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 None

            song_name = timestamps[i][1]
            output_path = os.path.join(save_dir, f"{song_name}.mp3")

            if end_time:
                duration = end_time - start_time
                ffmpeg_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 timestamps


if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()


代码详解

创建GUI界面

首先,我们使用wxPython创建一个简单的GUI界面,包含文件选择器、路径选择器以及一个文本区域(memo组件)用于输入时间戳和歌曲信息。

import wx
import os
import subprocess

class 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)
            return

        timestamps = self.parse_memo_content(memo_content)

        def hms_to_seconds(hms):
            h, m, s = map(int, hms.split(':'))
            return h * 3600 + m * 60 + s

        for 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 None

            song_name = timestamps[i][1]
            output_path = os.path.join(save_dir, f"{song_name}.mp3")

            if end_time:
                duration = end_time - start_time
                ffmpeg_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文件。

希望这个小工具能为你的音乐提取工作带来便利。如果你有任何问题或建议,欢迎留言讨论!

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

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

相关文章

逆向海淘商业模式案例分析:Cssbuy淘宝代购集运系统丨淘宝代购集运系统搭建攻略

逆向海淘商业模式案例分析&#xff1a;Cssbuy淘宝代购集运系统 一、系统概述 Cssbuy淘宝代购集运系统是一个专为海外消费者设计的跨境淘宝代购集运平台。该系统通过整合中国电商平台的商品资源&#xff0c;为海外消费者提供一站式的购物及物流解决方案。其特点主要体现在以下几…

springboot知识点大全

文章目录 LombokLombok介绍Lombok常用注解Lombok应用实例代码实现idea安装lombok插件 Spring InitializrSpring Initializr介绍Spring Initializr使用演示需求说明方式1: IDEA创建方式2: start.spring.io创建 注意事项和说明 yaml语法yaml介绍使用文档yaml基本语法数据类型字面…

无线领夹麦克风哪款好,领夹麦克风哪个品牌好,多款麦克风推荐

​科技发展让无线领夹麦克风成为现代演讲、演出和采访不可或缺的工具。这种小巧便携的设备让我们摆脱线缆束缚&#xff0c;自由移动同时保持声音清晰稳定。无线领夹麦克风怎么选呢&#xff1f;接下来&#xff0c;我们介绍几款市面上综合表现相当不错的无线领夹麦克风给大家来参…

整合微信支付一篇就够了

需要的工具 微信开发小程序工具 需要的材料 关键步骤 postman获取微信access_token https://api.weixin.qq.com/cgi-bin/token?appid=wxfssafa629021&grant_type=client_credential&secret=701d213dsfsdfsfdss4fb274生成h5跳转小程序的链接 https://api.weixin.…

内容安全复习 3 - 深度学习基础

文章目录 深度学习概述神经网络简介损失函数反向传播 卷积神经网络什么是卷积神经网络卷积最大池化展平典型的神经网络结构 Transformer&#xff08;转换器、变压器&#xff1f;&#xff09;自注意力机制多头注意力机制 深度学习概述 前文提到深度学习分三步&#xff1a;神经网…

express+vue在线im实现【四】

往期内容 expressvue在线im实现【一】 expressvue在线im实现【二】 expressvue在线im实现【三】 本期示例 本期总结 支持了音频的录制和发送&#xff0c;如果觉得对你有用&#xff0c;还请点个免费的收藏与关注 下期安排 在线语音 具体实现 <template><kl-dial…

2025天津数控机床展(天津工业展)

2025第21届天津工博会—机床展 时间&#xff1a;2025年3月6-9日 地点&#xff1a;国家会展中心&#xff08;天津&#xff09; 达成交易&#xff0c;是我们唯一的追求&#xff01; Dealing Is Our Top Pursuit. 主办单位 振威会展集团 中国机械工业联合会 中国国际贸易促…

Vscode远程ubuntu

远程连接 到这里vscode远程到ubuntu和关闭远程连接&#xff0c;已完成 配置python环境 在远程目录下新建.vscode隐藏文件夹&#xff0c;文件夹里新建一个 settings.json 文件&#xff0c; 先远程服务器看下conda下的python虚拟环境位置 settings.json位置及内容如下 测试pyt…

【STM32-DAP 仿真器】

STM32-DAP 仿真器 ■ STM32-DAP仿真器介绍■ STM32-DAP仿真特点■ STM32-DAP仿真器实物图■ STM32-DAP高速 DAP 仿真器实物图■ STM32-DAP高速无线调试器 实物图■ STM32-DAP高速无线调试器示意图■ STM32-DAP高速无线调试器接线图■ STM32-DAP高速无线调试器接收端示意图 ■ S…

等保2.0对云计算有哪些特定的安全要求?

等保2.0针对云计算环境设定了特定的安全要求&#xff0c;这些要求是在原有的安全通用要求基础上的扩展&#xff0c;旨在确保云服务的安全性和合规性。以下是一些关键的云计算安全扩展要求&#xff1a; 1. 基础设施的位置&#xff1a;等保2.0要求云计算基础设施位于中国境内&am…

API低代码平台介绍5-数据库记录修改功能

数据库记录修改功能 在上篇文章中我们介绍了如何插入数据库记录&#xff0c;本篇文章会沿用上篇文章的测试数据&#xff0c;介绍如何使用ADI平台定义一个修改目标数据库记录的接口&#xff0c;包括 单主键单表修改、复合主键单表修改、多表修改&#xff08;整合前两者&#xff…

Java图形用户界面设计AWT事件处理

AWT事件处理 前言一、GUI事件处理机制定义使用步骤Swing事件处理机制与AWT的区别 二、GUI中常见事件和事件监听器事件低级事件高级事件 事件监听器AWT事件类的继承关系 三、事件适配器三、示例代码示例示例一示例二 示例三 前言 推荐一个网站给想要了解或者学习人工智能知识的…

Jmeter性能 之 “查看结果树” 界面功能介绍

前言 查看结果树 显示所有请求响应的树&#xff0c;通过它可以查看任何请求的响应。除了显示响应之外&#xff0c;还可以查看获取响应所花费的时间以及一些响应代码。需要通过"查看结果树"来查看服务器处理请求之后的返回结果&#xff0c;分析是否存在问题 注意&am…

算力服务先锋!和鲸科技入选《2024中国智算产业生态图谱》

2024 年 6 月 18 日&#xff0c;由科智咨询发起的《2024中国智算产业生态图谱》正式发布&#xff0c;依托 ModelWhale 构建的智算算力资源服务&#xff0c;以及深耕多年的 ModelWhale 数据科学协同平台优势&#xff0c;和鲸科技成功入选。 “智算时代”技术不断进步&#xff0c…

生产实习Day13 ---- 神经网络模型介绍

文章目录 传统的神经网络模型注意力机制的引入注意力机制的本质Encoder-Decoder 框架注意力机制在 Encoder-Decoder 中的应用Self-Attention 机制Transformer 模型注意力机制的优势总结 传统的神经网络模型 在深度学习中&#xff0c;传统的神经网络模型&#xff0c;如循环神经…

react学习——09react中props属性

1、基本使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 移动端适配--><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>1_props基…

【前端vue3】TypeScrip-基础类型和任意类型

安装TypeScript npm install typescript -g 运行tsc -v可查看当前版本 为了方便调试可以安装 先安装小满zs大神写的工具&#xff0c;可以切换下载源 npm i xmzs -g 安装成功后 使用mmp ls查看当前的源有哪些 使用 mmp use选择镜像源 切换成功后&#xff0c;安装TypeScrip…

【51单片机】按键的操作

文章目录 前言读取按键的原理proteus仿真示例代码 总结 前言 在现代电子产品中&#xff0c;按键是用户与设备之间交互的重要组成部分。它们允许用户通过简单的按下来触发特定的操作或命令。在微控制器的背景下&#xff0c;按键的设计和操作对于确保设备的响应性和用户体验至关…

「ClickHouse 极简教程」分布式下的 IN/JOIN 及 GLOBAL关键字

百度安全验证https://baijiahao.baidu.com/s?id1712073808973941124&wfrspider&forpc

NSSCTF-Web题目12

目录 [SWPUCTF 2021 新生赛]finalrce 1、题目 2、知识点 3、思路 [UUCTF 2022 新生赛]ez_rce 1、题目 2、知识点 3、思路 [羊城杯 2020]easycon 1、题目 2、知识点 3、思路 [SWPUCTF 2021 新生赛]finalrce 1、题目 2、知识点 命令执行&#xff0c;tee命令 3、思路…