Python应用——ffmpeg处理音视频的常见场景

文章目录

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处理音视频几种常见的场景,大家可以根据需求下载文章开头附件提供的源代码直接使用。

相关推荐
l12345sy8 小时前
Day17_【机器学习—在线数据集 鸢尾花案例】
python·机器学习·信息可视化
weixin_456904279 小时前
多模态大语言模型部署
java·python·语言模型
mengjiexu_cn9 小时前
强化学习PPO/DDPG算法学习记录
python·学习·算法
念念01079 小时前
PyTorch
人工智能·pytorch·python
WSSWWWSSW9 小时前
Python OpenCV图像处理与深度学习:Python OpenCV性能优化与高效图像处理
图像处理·python·opencv
ILUUSION_S10 小时前
ReactAgent接入MCP服务工具
python·langchain
胖达不服输10 小时前
「日拱一码」076 深度学习——自然语言处理NLP
人工智能·python·深度学习·自然语言处理·nlp
LeonDL16810 小时前
基于YOLO11深度学习的植物叶片及缺陷检测系统【Python源码+Pyqt5界面+数据集+安装使用教程+训练代码】【附下载链接】
python·深度学习·yolo目标检测·yolov5数据集·yolov8数据集·yolo11数据集·植物叶片及缺陷检测系统
BillKu10 小时前
Spring Boot 后端接收多个文件的方法
spring boot·后端·python