【发布时间】:2017-12-17 17:44:54
【问题描述】:
我有一个 CMD 批处理脚本,可以将 mp4 视频文件夹转换为 webm。
您需要:
- FFmpeg/FFprobe 已安装并在环境变量中设置为从 CMD 运行。
- 一个包含 mp4 的文件夹,供 FFprobe 解析。
为方便起见,这只是脚本的第一部分,显示了Video Bitrate 变量。
这是一个完整的脚本,只需替换路径即可。
https://pastebin.com/raw/3ng77Exz
脚本的工作原理:
- 循环浏览文件夹中的所有视频
- 让 FFprobe 解析视频的比特率并将其保存到
%V和%vBitrate%。 - FFmpeg 使用
%V。比如-b:v %V就会变成解析后的值-b:v 9401k。 - 使用解析的比特率将每个视频从 mp4 转换为 webm
问题
我无法将 FFprobe 的输出保存到变量中。我想出了一个解决方法,首先将比特率值保存到temp file,然后将其导入%vBitrate% 变量。
例如:(%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrate.
作品
临时文件变量
cd "C:\Users\Matt\Videos\" && for %f in (*.mp4) do ffprobe -i "C:\Users\Matt\Desktop\Test\%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv="p=0" & for /f "tokens=*" %V in ("ffprobe -i "%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv=p=0") do (echo ) & (%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrate & del tmp_vBitrate & for /F %V in ('echo %vBitrate%') do (echo %V)
不起作用
内存变量
cd "C:\Users\Matt\Videos\" && for %f in (*.mp4) do ffprobe -i "C:\Users\Matt\Desktop\Test\%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv="p=0" & for /f "tokens=*" %V in ("ffprobe -i "%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv=p=0") do (echo ) & SET vBitrate=%V & for /F %V in ('echo %vBitrate%') do (echo %V)
测试它
运行第一个命令。完成后,在 CMD 中输入echo %vBitrate%,然后按 Enter。您将看到最后解析的 mp4 文件的比特率。
对第二个命令做同样的事情,你会发现它不起作用。
解决方案
我想摆脱 Temp File Variable 并让第二个命令工作。
(%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrate 改为 SET vBitrate=%V。
也许整个事情可以简化?我是不是用错了变量?
【问题讨论】:
-
看看delayed expansion...
%V > tmp_vBitrate应该做什么?我知道%V是一个迭代文件...请注意,对于for循环变量,您需要将批处理文件中的%-符号加倍(如%%V)... -
您应该提供minimal reproducible example 而不参考外部站点。使用
for /f解析命令的输出见ss64.com/nt/for_cmd.html 查看frequent ffmpeg Q&A -
我不熟悉
ffprobe,但我知道ffmpeg将其文件分析转储到stderr。尝试将2^>^&1添加到您的probe命令中。 -
@rojo 我使用了一个使用
2^>^&1的FFprobe 命令,它似乎可以工作。我用示例脚本发布了一个答案。谢谢。
标签: batch-file cmd ffmpeg