开发者

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

目录
  • 摘要
  • 1. 技术方案设计
    • 1.1 工具架构流程图
    • 1.2 核心依赖说明
  • 2. 核心代码实现
    • 2.1 音频提取函数
    • 2.2 通过streamlit生成调用的图形界面
  • 3. 典型错误处理

    摘要

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

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

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

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

    1. 技术方案设计

    1.1 工具架构流程图

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

    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。
        
        返回:
        stphpr: 提取后音频文件的路径。
        """
        # 检查视频文件是否存在
        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 a编程udio_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

    初期画面

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

    上传文件

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

    处理中

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

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

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

    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}')
                # 提供音频文件下载链接
          javascript      with open(audio_path, 'rb') as audio_file:
                    st.djavascriptownload_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.raZCKBESEenviron["TEMP"] = "D:/temp"

    结语

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

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

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜