gpt4 book ai didi

batch-file - CMD 批处理变量不会保存 FFprobe 输出

转载 作者:行者123 更新时间:2023-12-04 23:08:34 25 4
gpt4 key购买 nike

我有一个 CMD 批处理脚本,可以将 mp4 视频文件夹转换为 webm。

您将需要:

  • FFmpeg/FFprobe 在环境变量中安装并设置为从 CMD 运行。
  • 用于 FFprobe 解析的带有 mp4 的文件夹。


  • 为方便起见,这只是脚本的第一部分,显示 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)

    测试它

    运行第一个命令。完成后,输入 echo %vBitrate%在 CMD 中,然后按 Enter。您将看到最后解析的 mp4 文件的比特率。

    对第二个命令执行相同的操作,您会发现它不起作用。

    解决方案

    我想摆脱 Temp File Variable并让第二个命令起作用。
    (%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrate只需 SET vBitrate=%V .

    也许这整个事情可以简化?我是否使用了错误的变量?

    最佳答案

    我相信我使用不同的 FFmpeg 命令解决了这个问题 2^>^&1 .

    现在它不再使用临时文件来设置变量。

    视频码率

    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这将转换 mp4webm并使用 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")

    关于batch-file - CMD 批处理变量不会保存 FFprobe 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45072213/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com