【Python】一键提取视频音频并生成MP3的完整指南 by `MoviePy`

摘要

昨天, 我在让一个小朋友给我整理一次培训的视频的时候,我看到他把视频文件放到剪映里面处理。
我以为他要干什么呢, 还很期待,结果他只是为了导出音频而已。 于是就有了今天的这篇博客。

作为音视频处理领域的常用需求,视频转音频功能在内容二次创作、语音分析等场景中应用广泛。本文基于MoviePy库,手把手教大家实现跨平台视频转MP3工具的开发,涵盖以下技术要点:

  • 🎞️ 支持MP4/AVI/MOV等主流格式转换
  • 🎚️ 自动生成同路径MP3文件
  • 🛠️ 包含异常捕获与资源管理机制
  • 📟 提供开箱即用的命令行版本

1. 技术方案设计

1.1 工具架构流程图

有效
无效
用户输入视频路径
路径有效性校验
加载视频文件
抛出路径异常
提取音频轨道
MP3编码转换
保存输出文件
返回MP3路径

1.2 核心依赖说明

# 关键库版本要求
moviepy==1.0.3  # 音视频处理核心库

MoviePy官方文档

MoviePy依赖 NumpyimageioDecoratortqdm ,他们将在安装MoviePy的同时自动安装。运行平台为Windows/Mac/Linux,并使用Python2.7以上的版本和Python3。

MoviePy依赖FFMPEG软件对视频进行读写。不用对此担心,在你第一次使用MoviePy的时候,FFMPEG将会自动由ImageIO下载和安装(不过需要花一些时间)。如果你想使用FFMPEG的特定版本,你可以设置FFMPEG_BINARY环境变量。

2. 核心代码实现

2.1 音频提取函数

# 导入 moviepy 库中的 AudioFileClip 类,用于处理视频文件
from moviepy.audio.io.AudioFileClip import AudioFileClip
# 导入 os 模块,用于处理文件路径相关操作
import osdef extract_audio_from_video(video_path, audio_path=None):"""从视频中提取音频。参数:video_path (str): 视频文件的路径。audio_path (str, 可选): 提取后音频文件的保存路径,若未提供,则默认与视频文件同名,扩展名为 .mp3。返回:str: 提取后音频文件的路径。"""# 检查视频文件是否存在if not os.path.isfile(video_path):raise FileNotFoundError(f'指定的视频文件不存在: {video_path}')# 若未提供音频保存路径,则默认使用视频文件同名且扩展名为 .mp3 的路径if audio_path is None:audio_path = os.path.splitext(video_path)[0] + ".mp3"print(f"提取的音频路径: {audio_path}")try:# 创建 AudioFileClip 对象,用于提取视频中的音频with AudioFileClip(video_path) as audio_clip:# 将提取的音频保存到指定路径audio_clip.write_audiofile(audio_path, codec='mp3')return audio_pathexcept Exception as e:# 打印提取音频时出现的错误信息print(f"提取音频时出错: {e}")# 抛出异常,让调用者处理raise

这里要特别说明: 如果你用过老版本的MoviePy, 你这可能知道这个写法from moviepy.editor import AudioFileClip。 目前,田辛老师使用这个新版本,已经不用再加上.editor这个部分了, 反而加上会报错。正确的有两种写法:

  • from moviepy.audio.io.AudioFileClip import AudioFileClip
  • from moviepy import AudioFileClip

2.2 通过streamlit生成调用的图形界面

2.2.1. 图形界面layout
  1. 初期画面
    在这里插入图片描述

  2. 上传文件
    在这里插入图片描述

  3. 处理中
    在这里插入图片描述

  4. 处理结束可以下载,也可以在线听
    在这里插入图片描述

2.2.2. 源代码
```python
import streamlit as st
import os
from datetime import datetime
from video_audio_extractor import extract_audio_from_video
from dotenv import load_dotenv# 创建输入和输出目录
def create_directories():# 获取当前日期,并格式化为 yyyymmdd 的字符串today = datetime.now().strftime('%Y%m%d')# 定义输入目录,将其设置为 'input' 文件夹下以当前日期命名的子文件夹input_dir = os.path.join('input', today)# 定义输出目录,将其设置为 'output' 文件夹下以当前日期命名的子文件夹output_dir = os.path.join('output', today)# 创建输入目录,如果目录已存在则不会报错os.makedirs(input_dir, exist_ok=True)# 创建输出目录,如果目录已存在则不会报错os.makedirs(output_dir, exist_ok=True)# 返回创建好的输入目录和输出目录路径return input_dir, output_dir# 主函数
def main():# 加载环境变量文件# 若加载成功,继续执行后续操作;若失败,显示错误信息并终止程序if not load_dotenv():st.error("读取配置文件失败,请检查配置文件是否存在或路径是否正确")return# 创建输入和输出目录input_dir, output_dir = create_directories()# 设置应用标题st.title('视频提取音频工具')# 创建文件上传组件,仅允许上传指定类型的视频文件uploaded_file = st.file_uploader('请上传视频文件', type=['mp4', 'mov', 'avi'])# 创建转换按钮convert_button = st.button('转换为音频文件')if uploaded_file is not None and convert_button:try:# 初始化进度条progress_bar = st.progress(0)# 获取上传文件的扩展名file_extension = os.path.splitext(uploaded_file.name)[1]# 生成带有时间戳的新文件名new_file_name = f'video_audio_extractor_{datetime.now().strftime("%Y%m%d_%H%M%S")}'# 拼接视频文件保存路径video_path = os.path.join(input_dir, f"{new_file_name}{file_extension}")# 拼接音频文件保存路径audio_path = os.path.join(output_dir, f"{new_file_name}.mp3")print(audio_path)# 保存上传的视频文件with open(video_path, 'wb') as f:f.write(uploaded_file.getbuffer())# 更新进度条到 25%progress_bar.progress(25)# 调用提取音频的函数audio_path = extract_audio_from_video(video_path, audio_path)# 更新进度条到 100%progress_bar.progress(100)# 显示音频保存成功的消息st.success(f'音频已保存至 {audio_path}')# 提供音频文件下载链接with open(audio_path, 'rb') as audio_file:st.download_button('下载音频', audio_file, file_name=os.path.basename(audio_path))# 显示音频播放组件with open(audio_path, 'rb') as audio_file:st.audio(audio_file, format='audio/mp3')except Exception as e:# 捕获并显示处理过程中出现的错误st.error(f'处理过程中出错: {e}')if __name__ == '__main__':main()
```

3. 典型错误处理

错误类型解决方案
解码器缺失MoviePy依赖FFMPEG,如果没有装虽然它会自己下载,但是并不是最新版, 如果不可用的话,可以尝试手动安装最新版本,并设置环境变量Path
内存溢出增加临时目录设置:os.environ["TEMP"] = "D:/temp"

4. 结语

本文完整实现了从视频文件提取音频的自动化工具,开发者可直接集成到媒体处理系统中。建议搭配FFmpeg官方文档深入学习音视频编解码原理。欢迎在评论区交流使用心得,获取最新优化版本!

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

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

相关文章

PDF转长图工具

市面上的PDF转换工具数不胜数,福昕PDF、万兴PDF、Adobe Acrobat(DC)、PDF24等众多软件都具备PDF转图片的功能。然而,这些知名软件大多只能将单页PDF转换为单张图片,若要将PDF整体转换为一张长图,似乎并无此…

【Yolo精读+实践+魔改系列】Yolov3论文超详细精讲(翻译+笔记)

前言 前面咱们已经把 YOLOv1 和 YOLOv2 的老底都给掀了,今天轮到 YOLOv3 登场,这可是 Joseph Redmon 的“封神之作”。讲真,这哥们本来是搞学术的,结果研究的模型被某些军方拿去“整点活”——不是做人是做武器的那种活。于是他一…

算法攻略:接雨水问题的深度解析

算法攻略:接雨水问题的深度解析 一、引言 在算法的领域中,“接雨水”问题是一道经典且富有挑战性的题目。它不仅考查对数组操作的理解,更需要巧妙运用算法思想来解决看似复杂的实际场景问题。通过深入研究这一问题,我们能提升算法思维和编程能力,更好地应对各类算法难题。…

【Linux】Linux工具(1)

3.Linux工具(1) 文章目录 3.Linux工具(1)Linux 软件包管理器 yum什么是软件包关于 rzsz查看软件包——yum list命令如何安装软件如何卸载软件补充——yum如何找到要安装软件的下载地址 Linux开发工具Linux编辑器-vim使用1.vim的基…

springboot项目tomcat中加载不了

Spring Boot项目在Tomcat中加载不了的问题可能由多种原因引起,包括打包方式不正确、依赖配置错误、启动类配置不当等。以下是详细的解决方案: 1. 修改项目打包形式 将项目打包形式从jar改为war,以确保项目以正确的格式被Tomcat加载。在pom.…

Matlab 数控车床进给系统的建模与仿真

1、内容简介 Matlab217-数控车床进给系统的建模与仿真 可以交流、咨询、答疑 2、内容说明 略 摘 要:为提高数控车床的加工精度,对数控 车床进给系统中影响加工精度的主要因素进行了仿真分析研 动系统的数学模型,利用MATLAB软件中的动态仿真工具 究:依据机械动力学原理建立了…

Python Cookbook-7.8 使用 Berkeley DB 数据库

任务 你想将一些数据做持久化处理,而且也想体验一下BerkeleyDB数据库的简洁和高效。 解决方案 如果以前在你的计算机中安装过 BerkeleyDB,Python标准库附带的bsddb包(以及可选的 bsddb3,用于访间Berkeley DBrelease 3.2数据库)可以被用来作…

QT6 源(82):阅读与注释日历类型 QCalendar,本类并未完结,儒略历,格里高利历原来就是公历,

&#xff08;1&#xff09;本代码来自于头文件 qcalendar . h &#xff1a; #ifndef QCALENDAR_H #define QCALENDAR_H#include <limits>#include <QtCore/qglobal.h> #include <QtCore/qlocale.h> #include <QtCore/qstring.h> #include <QtCore/…

【C/C++】字符函数和字符串函数

文章目录 前言字符函数和字符串函数1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现3.1 代码演示3.2 strlen返回值3.3 strlen的模拟实现 4.strcpy的使用和模拟实现4.1 代码演示4.2 模拟实现 5.strcat的使用和模拟实现5.1 代码演示5.2 模拟实现 6.strcmp的使用和模拟实现…

Spark-core-RDD入门

RDD基本概念 Resilient Distributed Dataset 叫做弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象&#xff0c;是分布式计算的实现载体&#xff0c;代表一个不可变&#xff0c;可分区&#xff0c;里面的元素并行计算的集合。 - Dataset&#xff1a; 一个数据集合&…

缓存套餐-01.Spring Cache介绍和常用注解

一.Spring Cache 要使用直接导入坐标即可。 如何选择底层的缓存实现呢&#xff1f;只要导入对应的缓存坐标即可。如果要使用redis作为缓存实现&#xff0c;那么只需要导入redis的maven坐标。 二.常用注解 Cacheable&#xff1a;不光往缓存中写缓存数据&#xff0c;而且会从缓…

STM32智能空气净化器项目开发

一、项目概述 本空气净化器项目基于STM32F4系列微控制器&#xff0c;整合多传感器数据采集、环境参数显示、网络通信及执行机构控制等功能&#xff0c;实现智能化空气质量管理。项目采用FreeRTOS实时操作系统进行多任务调度&#xff0c;结合TFT触摸屏实现人机交互&#xff0c;…

[数据处理] 6. 数据可视化

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…

嵌入式学习笔记 - STM32 SRAM控制器FSMC

一 SRAM控制器内部结构图&#xff1a; 以下以512K SRAM芯片为例 二 SRAM地址矩阵/寻址方式&#xff1a; SRAM的地址寻址方式通过行地址与列地址交互的方式存储数据 三 STM32 地址映射 从STM32的地址映射中可以看出&#xff0c;FSMC控制器支持扩展4块外部存储器区域&#xff0…

python基础:序列和索引-->Python的特殊属性

一.序列和索引 1.1 用索引检索字符串中的元素 # 正向递增 shelloworld for i in range (0,len(s)):# i是索引print(i,s[i],end\t\t) print(\n--------------------------) # 反向递减 for i in range (-10,0):print(i,s[i],end\t\t)print(\n--------------------------) print(…

phpstudy升级新版apache

1.首先下载要升级到的apache版本&#xff0c;这里apache版本为Apache 2.4.63-250207 Win64下载地址&#xff1a;Apache VS17 binaries and modules download 2.将phpstudy中原始apache复制备份Apache2.4.39_origin 3.将1中下载apache解压&#xff0c; 将Apache24复制一份到ph…

开源业务流程:jBPM

一、什么是 jBPM&#xff1f; jBPM 是一个灵活的业务流程管理 (BPM) 套件。它不仅仅是一个流程引擎&#xff0c;而是一个集成了多种功能的平台&#xff0c;旨在帮助企业建模、自动化和监控业务流程。jBPM 遵循业界标准&#xff0c;特别是 BPMN 2.0&#xff08;业务流程模型和标…

JAVA:使用 JMH 进行基准测试的技术指南

1、简述 在性能优化中,写高效代码离不开准确的基准测试。而 Java 的 JIT 编译器会对代码进行优化(如方法内联、死代码消除等),导致简单的测试方法可能得不到真实的性能数据。这时候,JMH(Java Microbenchmark Harness)就派上用场了。 JMH 是 Java 官方提供的基准测试框…

Thinkphp开发自适应职业学生证书查询系统职业资格等级会员证书管理网站

环境&#xff1a;php7.2mysql5.7think伪静态 1.上传压缩包到服务器解压 2.还原数据库 3.配置数据库信息application/database.php 4.后台&#xff1a;http://你的域名/abc.php 用户&#xff1a;admin 密码&#xff1a;123456 程序说明&#xff1a; 【修复版】Thinkphp5开发的自…

(二)毛子整洁架构(CQRS/Dapper/领域事件处理器/垂直切片)

文章目录 项目地址一、Application 层1.1 定义CQRS的接口以及其他服务1. Command2. IQuery查询3. 当前时间服务接口4. 邮件发送服务接口 1.2 ReserveBooking Command1. 处理传入的参数2. ReserveBookingCommandHandler3. BookingReservedDomainEvent 1.3 Query使用Sql查询1. 创…