FFmpeg导出音量信息到文件并解析时出错的问题求助
FFmpeg导出音量信息到文件并解析时出错的问题求助
我来帮你捋清楚问题所在,其实就是两个小细节没处理对:
1. 核心错误:-f选项缺少必填参数
你命令里的-f是用来指定输出格式的,但后面没跟任何参数,ffmpeg自然会抛出「Missing argument for option 'f'」的错误。因为我们这里只是做音量检测,不需要生成实际的媒体文件,所以应该用null格式,再加上-作为占位符输出路径(null格式不会产生实际内容,但这个参数是必须的)。
修正后的ffmpeg基础命令应该是:
ffmpeg -i "%i" -af "volumedetect" -vn -sn -dn -f null -
2. 日志输出与管道的逻辑问题
你遇到的out.txt不完整、log.txt为空的问题,根源在这两点:
- FFmpeg的音量检测日志(包括
max_volume)是输出到标准错误流(stderr),而不是标准输出(stdout),你原来的1>> out.txt只捕获了stdout,根本没拿到关键的检测信息。 - 你的管道写法逻辑有问题:在ffmpeg还没完成输出甚至报错退出的时候,就用
findstr去读out.txt,此时out.txt里根本没写入max_volume内容,自然log.txt是空的。
给你两个可行的修正方案
方案一:用临时文件中转(纯CMD原生命令,无需额外工具)
这个方案会先把单个文件的检测日志存到临时文件,再分别追加到out.txt和提取max_volume到log.txt,避免重复读取大文件:
@echo off :: 先清空目标文件,避免残留旧内容 >out.txt (echo.) >log.txt (echo.) :: 遍历所有MKV文件 for %%i in (*.mkv) do ( echo 正在处理: "%%i" :: 把当前文件的FFmpeg日志(stderr转stdout)存到临时文件 ffmpeg -i "%%i" -af "volumedetect" -vn -sn -dn -f null - 2>&1 > temp_log.txt :: 把临时日志追加到总out.txt type temp_log.txt >> out.txt :: 提取max_volume追加到log.txt findstr "max_volume" temp_log.txt >> log.txt :: 删除临时文件 del temp_log.txt )
(注意:如果是在CMD窗口直接执行,把%%i改成%i;如果写在批处理文件里,保留%%i)
方案二:用管道同时写入和提取(需要PowerShell)
如果你能使用PowerShell,可以更高效地同时把日志写入out.txt并提取max_volume:
Get-ChildItem -Filter *.mkv | ForEach-Object { Write-Host "Processing $($_.Name)" ffmpeg -i "$($_.FullName)" -af "volumedetect" -vn -sn -dn -f null - 2>&1 | ForEach-Object { $_ | Add-Content out.txt if ($_ -match 'max_volume') { $_ | Add-Content log.txt } } }
验证效果
修正后,out.txt会完整保存每个文件的FFmpeg检测日志,log.txt则会只保留每个文件的max_volume条目,不会再出现空文件的情况啦。
备注:内容来源于stack exchange,提问作者user1855174
相关产品推荐
相关产品推荐

