You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:58:07