当前位置: 首页 > web >正文

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

文章目录

    • 1、音频转mp3格式
    • 2、mp3音频拼接
    • 3、音频截取
    • 4、视频提取音频
    • 5、总结

1、音频转mp3格式

这个工具通过图形界面让用户方便地选择文件,同时利用 ffmpeg 的强大功能进行音频格式转换,适合需要批量处理音频文件的场景。

  • 导入库:
import os #用于处理文件路径和系统操作
import subprocess #用于调用系统命令(这里主要用来调用 ffmpeg)
from tkinter import Tk #用于创建图形界面,实现文件选择和消息提示
from tkinter.filedialog import askopenfilenames
from tkinter import messagebox
  • check_ffmpeg函数:
#检查系统是否安装了 ffmpeg(这是音频转换的核心工具)
def check_ffmpeg():try:subprocess.run(["ffmpeg", "-version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True) #尝试运行ffmpeg -version命令return True #如果安装了 ffmpeg 返回True,否则返回Falseexcept (subprocess.SubprocessError, FileNotFoundError):return False
  • 转换函数中关键参数:
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 文件,会提示并退出。
# 获取文件夹中所有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 前面的问题)。
# 自定义排序键:提取文件名中的数字
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 使用,处理完成后会自动删除这个临时文件。
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 协议进行无损合并。
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 命令:
command = ['ffmpeg','-i', input_file,  # 输入文件'-t', str(duration),  # 截取时长'-c', 'copy',  # 直接复制流,不重新编码output_file,  # 输出文件'-y'  # 覆盖已存在的输出文件]
  • 执行命令并处理结果,使用subprocess.run()执行构建好的 ffmpeg命令,通过check=True参数确保命令执行失败时会抛出异常,捕获并处理可能出现的各种错误。
 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格式。

  • 文件选择
def select_video_file():root = tk.Tk()root.withdraw()  # 隐藏主窗口file_path = filedialog.askopenfilename(title="选择视频文件",filetypes=[("视频文件", "*.mp4 *.avi *.mov *.mkv *.flv *.wmv"), ("所有文件", "*.*")])return file_path
  • 音频提取
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处理音视频几种常见的场景,大家可以根据需求下载文章开头附件提供的源代码直接使用。

http://www.xdnf.cn/news/19842.html

相关文章:

  • GitLab,2025最新如何配置中的SSH key步骤
  • 【高等数学】第十一章 曲线积分与曲面积分——第一节 对弧长的曲线积分
  • GaussDB 数据库架构师修炼(十九)-性能调优-长事务分析
  • leetcode-每日一题-3025. 人员站位的方案数 I-C语言
  • 解决完美主义的方法是,去追求不完美--辩证法
  • OpenAI印度1GW数据中心计划:全球AI基础设施博弈的加速
  • Web3 出海香港 101 |BuildSpace AMA 第一期活动高亮观点回顾
  • 向成电子惊艳亮相2025物联网展,携工控主板等系列产品引领智造新风向
  • Linux网络编程套接字(五)之简单的TCP网络程序3【TCP守护进程化】
  • Corona渲染噪点终结指南:3ds Max高效去噪全攻略
  • matplotlib中文宋体,西文新罗马
  • 自学嵌入式第三十二天:网络编程-UDP
  • 最常见的设备管理系统有哪些?设备采购、盘点、库存管理软件TOP10
  • 只需几条命令,本地体验微软最新长文本语音合成 VibeVoice(支持中文)
  • 专有云企业级特征
  • Turso数据库:用Rust重构的下一代SQLite——轻量级嵌入式数据库的未来选择
  • 碳酸钆:稀土家族里看不见的科技推手
  • 【Maven】《十分钟搞清Maevn项目》
  • 第四章 windows实战-emlog
  • 什么是流程图:流程六要素、三大结构及绘制规范总结
  • 【光照】Unity中的[经验模型]
  • 零工考勤不准、发薪扯皮?盖雅方案让每份工时都清晰可信
  • Web3兴起:重新定义互联网格局
  • 51c大模型~合集177
  • 对象存储 - 同步数据
  • 分布式爬虫的全局请求间隔协调与IP轮换策略
  • 开发(1)获取用户登录IP
  • 信息安全各类加密算法解析
  • 【C++】14. 多态
  • uniapp H5预览图片组件