Windows下ffmpeg批处理遍历当前文件夹下所有特定格式文件(如MP4等)无损提取视频音频且生成文件存到原视频文件夹下同时跳过已经处理的文件

本文介绍了如何使用批处理命令ffmpeg高效地将视频文件批量无损转换为音频,尤其针对机械硬盘环境下,通过一次性处理多个文件夹下的视频,避免磁头频繁移动造成的性能下降。代码示例展示了如何遍历指定目录及其子目录,进行音频提取。这种方法能保持极高的磁盘读取效率和CPU占用率。

使用场景说明

我习惯闲暇之余听考研政治课的音频
原版低级代码如下

for %%a  in  (*.mp4)  do ffmpeg -threads 15 -i  "%%a"   -vn -acodec copy "%%a.aac" -n
pause

此代码仅仅能够实现将bat代码所在文件夹下的视频给无损且无转码高速转换为音频(上百倍速度)
注释:下面的采取的aac是常见视频的内嵌音频流,有的视频比如油管下载下来的mkv格式音乐视频内的音频为fltp格式等,用

ffmpeg -i 文件

即可获取文件内置默认音频的格式,如下若为fltp的格式音频,想要不转码高速输出就得修改aac为fltp
在这里插入图片描述

回到正题

之所以不能一个个文件夹下慢慢去一个个启动程序来处理,仅仅是因为我储存视频文件用的是机械硬盘,所以要是一个个文件夹分开的启动多个命令,由于机械硬盘结构设计局限,同时吞吐多个不同位置下的文件需要磁头来回到不同扇区工作,类似于分身乏术就会将几十mb/s的读取性能拉到可怜的个位数4mb/s左右,所以需要找到方法一个程序打开便能够读取多个文件夹下的视频来提取音频同时方便查找放音频到原来的视频所在文件夹下

for /r . %%a  in  (/*.mp4)  do ffmpeg -threads 15 -i  "%%a"   -vn -acodec copy "%%a.aac" -n
pause

注解什么的懒得注解了,看这篇一样
(原文中用的是%%i 这里用的是%%a 不影响)
参考文章

https://www.cnblogs.com/xpwi/p/9626959.html

在这里插入图片描述
效果如下上百倍速度(有的甚至上千倍)
在这里插入图片描述
CPU占用超低同时磁盘占用效率极高
在这里插入图片描述

你可以使用 `ffmpeg` 结合 Python 的 `subprocess` 模块来统计特定文件夹下每个 `.mp4` 视频文件的时长。`ffmpeg` 是一个非常强大的多媒体处理工具,`ffprobe` 是其内置的媒体文件分析工具,可以用来提取视频的元数据,包括视频时长。 --- ### ✅ 实现理: 使用 `ffprobe` 命令行工具分析视频文件提取 `duration` 字段,然后通过 Python 遍历文件夹查找 `.mp4` 文件并调用 `ffprobe` 获取时长。 --- ### ✅ 示例代码如下: ```python import os import subprocess def get_video_duration(file_path): """ 使用 ffprobe 获取视频时长(秒) """ cmd = [ 'ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'default=nw=1', file_path ] try: result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) duration = float(result.stdout.strip()) return duration except Exception as e: print(f"无法读取视频 {file_path}: {e}") return None def format_seconds(seconds): """ 将秒数格式化为 HH:MM:SS """ m, s = divmod(int(seconds), 60) h, m = divmod(m, 60) return f"{h:02d}:{m:02d}:{s:02d}" def list_mp4_durations(folder_path): """ 遍历文件夹查找所有 .mp4 文件并输出时长 """ for root, dirs, files in os.walk(folder_path): for file in files: if file.lower().endswith(".mp4"): full_path = os.path.join(root, file) duration = get_video_duration(full_path) if duration is not None: print(f"{full_path} -> {format_seconds(duration)}") # 示例调用 folder = "/path/to/your/mp4/folder" list_mp4_durations(folder) ``` --- ### ✅ 安装和配置要求: - 你需要在系统中安装 `ffmpeg`,并确保 `ffprobe` 在命令行中可用。 #### 安装方法: - **Windows:** 下载 [https://www.gyan.dev/ffmpeg/builds/](https://www.gyan.dev/ffmpeg/builds/),解压后将 `bin` 目录添加到系统环境变量 `PATH`。 - **macOS:** ```bash brew install ffmpeg ``` - **Linux (Ubuntu/Debian):** ```bash sudo apt update sudo apt install ffmpeg ``` --- ### ✅ 优点: - 不依赖 Python 第三方库; - 速度快,资源占用低; - 支持几乎所有常见视频格式。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值