文章目录
1、音频转mp3格式
这个工具通过图形界面让用户方便地选择文件,同时利用 ffmpeg 的强大功能进行音频格式转换,适合需要批量处理音频文件的场景。
- 导入库:
python
import os #用于处理文件路径和系统操作
import subprocess #用于调用系统命令(这里主要用来调用 ffmpeg)
from tkinter import Tk #用于创建图形界面,实现文件选择和消息提示
from tkinter.filedialog import askopenfilenames
from tkinter import messagebox
- check_ffmpeg函数:
python
#检查系统是否安装了 ffmpeg(这是音频转换的核心工具)
def check_ffmpeg():
try:
subprocess.run(["ffmpeg", "-version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True) #尝试运行ffmpeg -version命令
return True #如果安装了 ffmpeg 返回True,否则返回False
except (subprocess.SubprocessError, FileNotFoundError):
return False
- 转换函数中关键参数:
python
subprocess.run([
"ffmpeg", "-i", input_file, #使用ffmpeg转换,采用常见的MP3编码参数
"-codec:a", "libmp3lame", #使用MP3编码
"-b:a", "192k", #比特率192kbps(高质量设置)
"-y", #覆盖已存在的文件
output_file
], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True) #主要用于执行外部命令并管理其输入/输出流
2、mp3音频拼接
该工具的主要功能是将文件夹中所有 MP3 文件按特定顺序合并为单个 MP3 文件,且保持音频质量不变(无损合并)。
- 获取 MP3 文件,扫描指定文件夹,筛选出所有扩展名为.mp3的文件,如果没有找到 MP3 文件,会提示并退出。
python
# 获取文件夹中所有MP3文件
mp3_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.mp3')]
# 检查是否有MP3文件
if not mp3_files:
print("在指定文件夹中没有找到MP3文件")
return
- 文件排序处理,优先按文件名中的数字排序(如 "1.mp3" 排在 "2.mp3" 前面),对于不能转换为数字的文件名,会被排在最后(避免 10.mp3 排在 2.mp3 前面的问题)。
python
# 自定义排序键:提取文件名中的数字
def extract_number(filename):
name_without_ext = os.path.splitext(filename)[0]
try:
return int(name_without_ext) # 文件名是数字则返回数字
except ValueError:
return float('inf') # 非数字文件名放最后
# 按提取的数字排序
mp3_files.sort(key=extract_number)
- 生成一个临时的mp3_list.txt文件,里面按格式记录了所有 MP3 文件的绝对路径,供 ffmpeg 使用,处理完成后会自动删除这个临时文件。
python
temp_list_file = "mp3_list.txt"
with open(temp_list_file, 'w', encoding='utf-8') as f:
for file in mp3_files:
file_path = os.path.join(folder_path, file)
abs_path = os.path.abspath(file_path) # 获取绝对路径
f.write(f"file '{abs_path}'\n") # 按ffmpeg要求的格式写入
- 调用 ffmpeg 合并,使用 ffmpeg 的 concat 协议进行无损合并。
python
cmd = [
'ffmpeg',
'-f', 'concat', # 使用concat协议
'-safe', '0', # 允许绝对路径
'-i', temp_list_file, # 输入文件列表
'-c', 'copy', # 无损复制,不重新编码
'-y', # 覆盖已有文件
output_file
]
# 执行命令
result = subprocess.run(cmd, check=True, capture_output=True, text=True)
3、音频截取
该工具的主要功能是对输入的音频文件进行截取,提取出指定时长的片段,并保存为新的音频文件。
- def trim_audio(input_file, output_file, duration=22),核心函数,接收三个参数:
input_file:输入音频文件的路径
output_file:输出截取后音频文件的路径
duration:截取的时长(秒) - 函数构建 ffmpeg 命令:
python
command = [
'ffmpeg',
'-i', input_file, # 输入文件
'-t', str(duration), # 截取时长
'-c', 'copy', # 直接复制流,不重新编码
output_file, # 输出文件
'-y' # 覆盖已存在的输出文件
]
- 执行命令并处理结果,使用subprocess.run()执行构建好的 ffmpeg命令,通过check=True参数确保命令执行失败时会抛出异常,捕获并处理可能出现的各种错误。
python
subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(f"成功截取音频前{duration}秒,保存为: {output_file}")
截取过程不重新编码(-c copy参数),因此速度快且不会损失音频质量,可以通过修改duration参数来改变截取的时长,例如trim_audio(input, output, 30)会截取前 30 秒。
4、视频提取音频
这是一个从视频文件中提取音频的工具,通过简单的图形界面让用户操作,从选定的视频中提取音频并保存为 MP3格式。
- 文件选择
python
def select_video_file():
root = tk.Tk()
root.withdraw() # 隐藏主窗口
file_path = filedialog.askopenfilename(
title="选择视频文件",
filetypes=[("视频文件", "*.mp4 *.avi *.mov *.mkv *.flv *.wmv"), ("所有文件", "*.*")]
)
return file_path
- 音频提取
python
def extract_audio(video_path, output_path=None):
try:
# 使用FFmpeg提取音频的命令
subprocess.run([
'ffmpeg',
'-i', video_path, # 输入文件
'-vn', # 不处理视频
'-acodec', 'libmp3lame',# 使用MP3编码器
'-q:a', '2', # 音频质量(0-9,数值越小质量越高)
output_path
], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return output_path
默认情况下,提取的音频会与原视频保存在同一目录,文件名相同但扩展名为.mp3。
5、总结
本文介绍了使用ffmpeg处理音视频几种常见的场景,大家可以根据需求下载文章开头附件提供的源代码直接使用。