【源代码】基于streamlit和FFmpeg的音频文件格式互转(文件夹批量转)

一、软件实测图:

1、软件载入初始界面:

2、格式转换过程界面:

3、格式转换完成界面:

二、源代码

# 整个文件夹批量转换(添加开始转换和重置按钮)
import streamlit as st
from pydub import AudioSegment
import os
import sys

def convert_audio_format(input_file, output_format, output_folder):
    try:
        audio = AudioSegment.from_file(input_file)
        base_name = os.path.splitext(os.path.basename(input_file))[0]
        output_filename = os.path.join(output_folder, f"{base_name}.{output_format}")
        
        export_params = {
            'format': output_format,
            'bitrate': '192k'
        }
        
        if output_format == 'wav':
            export_params['parameters'] = ['-acodec', 'pcm_s16le']
        
        audio.export(output_filename, **export_params)
        return output_filename
    except Exception as e:
        return f"转换失败: {input_file} - {str(e)}"

def clear_recover():
    st.session_state.dynamic_text = ""
    st.session_state.clear()

# 初始化session状态
if 'converted_files' not in st.session_state:
    st.session_state.converted_files = []
if 'error_messages' not in st.session_state:
    st.session_state.error_messages = []
if 'output_folder' not in st.session_state:
    st.session_state.output_folder = ""
if "dynamic_text" not in st.session_state:
    st.session_state.dynamic_text = ""
        
st.title("🎵 音频文件格式批量转换工具")
st.markdown("支持格式: MP3, WAV, FLAC, OGG, AAC")


with st.expander("📂 文件夹设置", expanded=True):
    folder_path = st.text_input("请输入源文件夹路径:", value=st.session_state.dynamic_text,
                                key="dynamic_text", help="应包含要转换的音频文件")
    
    if folder_path:
        if not os.path.exists(folder_path):
            st.error("路径不存在,请检查输入!")
            st.stop()
        
        if not os.path.isdir(folder_path):
            st.error("请输入有效的文件夹路径!")
            st.stop()

output_format = st.selectbox("选择目标格式:", ["mp3", "wav", "flac", "ogg", "aac"], index=0)

col1, col2, col3 = st.columns([1,1,3])
with col1:
    start_btn = st.button("🚀 开始转换")
with col2:
    st.button("🔄 重置", on_click=clear_recover)

if start_btn and folder_path:
    parent_dir = os.path.dirname(folder_path.rstrip(os.sep))
    base_folder = os.path.basename(folder_path.rstrip(os.sep))
    st.session_state.output_folder = os.path.join(parent_dir, f"{base_folder}_converted_{output_format}")
    
    os.makedirs(st.session_state.output_folder, exist_ok=True)
    
    supported_ext = ['.mp3', '.wav', '.flac', '.ogg', '.aac', '.m4a']
    file_list = []
    for root, _, files in os.walk(folder_path):
        for file in files:
            if os.path.splitext(file)[1].lower() in supported_ext:
                file_list.append(os.path.join(root, file))
    
    if not file_list:
        st.error("未找到支持的音频文件!")
        st.stop()
    
    progress_bar = st.progress(0)
    status_text = st.empty()
    
    total_files = len(file_list)
    for index, input_file in enumerate(file_list):
        try:
            status_text.markdown(f"正在处理:`{os.path.basename(input_file)}`")
            
            result = convert_audio_format(input_file, output_format, st.session_state.output_folder)
            if "转换失败" in result:
                st.session_state.error_messages.append(result)
            else:
                st.session_state.converted_files.append(result)
            
            progress = (index + 1) / total_files
            progress_bar.progress(progress)
            
        except Exception as e:
            st.session_state.error_messages.append(f"严重错误: {input_file} - {str(e)}")
    
    progress_bar.empty()
    st.balloons()
    st.success(f"转换完成!共处理 {len(file_list)} 个文件,成功 {len(st.session_state.converted_files)} 个")

if st.session_state.converted_files or st.session_state.error_messages:
    st.subheader("📋 转换结果")
    
    tab1, tab2 = st.tabs(["✅ 成功文件", "❌ 错误信息"])
    
    with tab1:
        if st.session_state.converted_files:
            st.write(f"输出目录:`{st.session_state.output_folder}`")
            for file in st.session_state.converted_files:
                st.markdown(f"- `{os.path.basename(file)}`")
        else:
            st.info("暂无成功转换的文件")
    
    with tab2:
        if st.session_state.error_messages:
            for msg in st.session_state.error_messages:
                st.error(msg)
        else:
            st.info("没有错误发生")

st.markdown("---")
st.markdown("""
**使用说明:**
1. 输入包含音频文件的文件夹路径
2. 选择要转换的目标格式
3. 点击开始转换按钮
4. 转换后的文件会保存在新创建的文件夹中
""")

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值