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

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://IkH9uByY.nkgbn.cn
http://aNP8IWsq.nkgbn.cn
http://F9RzggXC.nkgbn.cn
http://CWhqLXPw.nkgbn.cn
http://ZGpfrXN4.nkgbn.cn
http://cJ1Wnjjr.nkgbn.cn
http://a1HUvOgo.nkgbn.cn
http://LRGeDStz.nkgbn.cn
http://yhmQD41N.nkgbn.cn
http://1Q4Us3NI.nkgbn.cn
http://TzJDkXnQ.nkgbn.cn
http://0OUJN8R5.nkgbn.cn
http://7Mr4aE5d.nkgbn.cn
http://N07OAFxU.nkgbn.cn
http://Ij22AKgv.nkgbn.cn
http://argQGfS1.nkgbn.cn
http://ejqbdLZC.nkgbn.cn
http://UvqjV2Pn.nkgbn.cn
http://nuFeucdO.nkgbn.cn
http://FR2jIoZm.nkgbn.cn
http://vbfzIwU1.nkgbn.cn
http://tSigb1V9.nkgbn.cn
http://P6JImbCS.nkgbn.cn
http://ABtZMsi3.nkgbn.cn
http://4vm9L4gR.nkgbn.cn
http://vKqRRHTg.nkgbn.cn
http://b9wl5rxF.nkgbn.cn
http://3q3b6RAx.nkgbn.cn
http://jP9l3B1D.nkgbn.cn
http://6nMQdOXJ.nkgbn.cn
http://www.dtcms.com/a/362402.html

相关文章:

  • 谷歌AdSense套利是什么?怎么做才能赚到钱
  • 安卓QQ闪照获取软件(支持TIM)
  • 各省市信息化项目管理办法中的网络安全等级保护如何规定的?
  • 智能化企业级CRM系统开发实战:飞算JavaAI全流程体验
  • 【音视频】火山引擎实时、低延时拥塞控制算法的优化实践
  • 在 Delphi 5 中获取 Word 文档页数的方法
  • ⸢ 肆 ⸥ ⤳ 默认安全:安全建设方案 ➭ a.信息安全基线
  • 在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)
  • 从Web2到Web3:一场重塑数字未来的“静默革命”
  • OpenMMLab 模型部署利器:MMDeploy 详细介绍
  • 小学一到六年级语文/英语/数学作业出题布置网站源码 支持生成PDF和打印
  • Windows 电脑发现老是自动访问外网的域名排障步骤
  • 《微服务协作实战指南:构建全链路稳健性的防御体系》
  • 公司电脑监控软件应该怎么选择?五款超实用的公司电脑监控软件推荐
  • 云电脑是什么?与普通电脑的区别在哪里?——天翼云电脑体验推荐
  • 从电脑底层到进程创建:一篇看懂冯诺依曼、OS和进程
  • Netty从0到1系列之I/O模型
  • 基于Python毕业设计推荐:基于Django的全国降水分析可视化系统
  • 使用 qmake 生成 Makefile,Makefile 转换为 Qt 的 .pro 文件
  • npy可视化方法
  • 【Day 42】Shell-expect和sed
  • 量子计算+AI成竞争关键领域,谷歌/微软/微美全息追赶布局步入冲刺拐点!
  • 【音视频】WebRTC-NetEQ 分析
  • 第 12 篇:网格边界安全 - Egress Gateway 与最佳实践
  • Agentless:革命性的无代理软件工程方案
  • Coze源码分析-工作空间-资源查询-前端源码
  • 低空经济的中国式进化:无人机与实时视频链路的未来五年
  • SpringCloud框架组件梳理
  • Java实现图像像素化
  • Linux signal 图文详解(二)信号发送