我有一个CMD批处理脚本,可以将mp4视频的文件夹转换为webm。
您需要:
为了方便起见,这只是脚本的第一部分,显示了Video Bitrate
变量。
这是一个完整的脚本,只需替换路径即可 https://pastebin.com/raw/3ng77Exz
脚本的工作原理:
%V
和
%vBitrate%
。%V
。例如-b:v %V
将成为解析值
-b:v 9401k
。我无法将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
。
也许整个事情可以简化?我使用的变量是错误的吗?
答案 0 :(得分:2)
我相信我使用2^>^&1
的不同FFmpeg命令解决了这个问题。
现在它不再使用临时文件来设置变量。
视频比特率
for /F "delims=" %V in ('@ffprobe -v error -select_streams v:0 -show_entries stream^=bit_rate -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET vBitrate=%V) & for /F %V in ('echo %vBitrate%') do (echo %V)
音频比特率
for /F "delims=" %A in ('@ffprobe -v error -select_streams a:0 -show_entries stream=bit_rate -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET aBitrate=%A) & for /F %A in ('echo %aBitrate%') do (echo %A)
完整脚本
以下是一个完整的batch script
,可将mp4
转换为webm
,并使用video birate = (((size * 8) / 1000) / duration) * 1000
自动计算和匹配比特率。
cd "C:\Users\Matt\Videos\" && for %f in (*.mp4) do (for /F "delims=" %S in ('@ffprobe -v error -select_streams v:0 -show_entries format^=size -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET size=%S) & for /F %S in ('echo %size%') do (echo %S) & for /F "delims=" %D in ('@ffprobe -v error -select_streams v:0 -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET duration=%D) & for /F "tokens=1 delims=." %R in ('echo %duration%') do (SET duration=%R) & for /F %D in ('echo %duration%') do (echo %D) & for /F "delims=" %V in ('@ffprobe -v error -select_streams v:0 -show_entries stream^=bit_rate -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET vBitrate=%V) & for /F %V in ('echo %vBitrate%') do (echo %V) & (if %V EQU N/A (SET /a vBitrate=%S*8/1000/%D*1000) ELSE (echo Video Bitrate Detected)) & for /F %V in ('echo %vBitrate%') do (echo %V) & for /F "delims=" %A in ('@ffprobe -v error -select_streams a:0 -show_entries stream=bit_rate -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (echo) & SET aBitrate=%A & for /F %A in ('echo %aBitrate%') do (echo %A) & (IF %A EQU N/A (SET aBitrate=320000)) & for /F %A in ('echo %aBitrate%') do (echo %A) & (IF %A gtr 500000 (SET aBitrate=500000) ELSE (echo Bitrate within Vorbis Limit of 500k)) & for /F %A in ('echo %aBitrate%') do (echo %A) && ffmpeg -y -i "C:\Users\Matt\Videos\%~f" -vcodec libvpx -quality good -cpu-used 0 -b:v %V -pass 1 -acodec libvorbis -b:a %A -map 0:v:0? -map 0:a:0? -sn -map_metadata 0 -threads 8 "C:\Users\Matt\Videos\%~nf.webm" && ffmpeg -y -i "C:\Users\Matt\Videos\%~f" -vcodec libvpx -quality good -cpu-used 0 -b:v %V -pass 2 -acodec libvorbis -b:a %A -map 0:v:0? -map 0:a:0? -sn -map_metadata 0 -threads 8 "C:\Users\Matt\Videos\%~nf.webm")