Python基于MoviePy实现一键提取视频音频并生成MP3

 更新时间:2025年05月09日 11:17:09   作者:田辛 | 田豆芽  
作为音视频处理领域的常用需求,视频转音频功能在内容二次创作等场景中应用广泛,本文将基于MoviePy库为大家介绍如何实现跨平台视频转MP3工具的开发,感兴趣的可以了解下

摘要

昨天, 我在让一个小朋友给我整理一次培训的视频的时候,我看到他把视频文件放到剪映里面处理。

我以为他要干什么呢, 还很期待,结果他只是为了导出音频而已。 于是就有了今天的这篇博客。

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

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

1. 技术方案设计

1.1 工具架构流程图

1.2 核心依赖说明

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

MoviePy官方文档

MoviePy依赖 Numpy 、 imageio 、 Decorator 和 tqdm ,他们将在安装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 os

def 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_path
    except 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

初期画面

上传文件

处理中

处理结束可以下载,也可以在线听

2.2.2. 源代码

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"

结语

本文完整实现了从视频文件提取音频的自动化工具,开发者可直接集成到媒体处理系统中。建议搭配FFmpeg官方文档深入学习音视频编解码原理。

到此这篇关于Python基于MoviePy实现一键提取视频音频并生成MP3的文章就介绍到这了,更多相关Python MoviePy提取视频音频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何基于python实现不邻接植花

    如何基于python实现不邻接植花

    这篇文章主要介绍了如何基于python实现不邻接植花,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python Log文件大小设置及备份的方法

    Python Log文件大小设置及备份的方法

    这篇文章主要介绍了Python Log文件大小设置及备份的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Python进程的通信Queue、Pipe实例分析

    Python进程的通信Queue、Pipe实例分析

    这篇文章主要介绍了Python进程的通信Queue、Pipe,结合实例形式分析了Python进程通信Queue、Pipe基本概念、用法及操作注意事项,需要的朋友可以参考下
    2020-03-03
  • 如何使用Python的OpenCV库处理图像和视频

    如何使用Python的OpenCV库处理图像和视频

    基于opencv可以显示图片,并进行相应的处理,下面这篇文章主要给大家介绍了关于如何使用Python的OpenCV库处理图像和视频的相关资料,需要的朋友可以参考下
    2022-10-10
  • 详解如何使用OpenCV和像素处理图像灰度化

    详解如何使用OpenCV和像素处理图像灰度化

    这篇文章主要为大家介绍了如何使用OpenCV和像素处理图像灰度化的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • python调试过程中多颜色输出方式

    python调试过程中多颜色输出方式

    这篇文章主要介绍了python调试过程中多颜色输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python实现将HTML转换成doc格式文件的方法示例

    Python实现将HTML转换成doc格式文件的方法示例

    这篇文章主要介绍了Python实现将HTML转换成doc格式文件的方法,涉及Python htmlparser及docx模块的相关使用技巧,需要的朋友可以参考下
    2017-11-11
  • python实现图片自动分类小程序

    python实现图片自动分类小程序

    这篇文章主要为大家详细介绍了如何使用python实现图片自动分类小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • pycharm打开chrome自动退出错误的解决方法

    pycharm打开chrome自动退出错误的解决方法

    这篇文章主要给大家介绍了关于pycharm打开chrome自动退出错误的解决方法,文中通过实例代码以及图文将解决的办法介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Python数据存储之 h5py详解

    Python数据存储之 h5py详解

    今天小编就为大家分享一篇Python数据存储之 h5py详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12

最新评论