windows - 如何从标准输出设置逗号分隔值?

标签 windows batch-file video ffmpeg

我有一个处理 ffprobe 查询输出的批处理文件。它检索我用来确定某些 ffmpeg 指令的几位数据。特别是如果视频帧高度为 720 或更高,我会将 h264 视频转换为 h265。我还将音频流转换为 aac,如果它还没有,并且如果该流高于 128 kbps,我将其转换为 128。

我可以通过多次调用 ffprobe 并使用 if 语句来决定我的 ffmpeg 命令是什么来完成所有这些工作。

我希望我的批处理文件更有效率,所以我在想,如果我可以获取一个(可能是两个)ffprobe 查询的输出,然后将该输出粘贴到 for/f token=.... 循环中,那么我可以将每个 ffprobe 数据点设置为一个变量,然后只需检查变量以确定生成的 ffmpeg 命令将是什么。

这是我现在只需检查视频流是否为 hevc 的内容。如果不是,则 ffmpeg 将视频转换为 hevc 并将音频复制到 aac。

for %%a in ("*.*") do (
ffprobe -v quiet -show_entries stream=index,codec_name,height -of csv "%%a" 2>&1 | findstr "hevc"
if errorlevel 1 (
    ffmpeg.exe -hwaccel cuvid -i "%%a" -pix_fmt p010le -c:v hevc_nvenc -preset slow -rc vbr_hq -b:v 4M -maxrate:v 10M -c:a aac "%%~na.h265-convert.mp4"
))

ffprobe 查询输出如下所示:
stream,0,h264,480

我在想是否可以使用以下内容标记该输出:
for /f "tokens=1,2,3,4 delims= " %%a in ("______") do set codec=%%b&set fheight=%%d

我不知道在我有_______的地方放什么。我真的不想创建一个临时文件,除非那是唯一的选择。

1)这是实现我想要做的有效方法吗?

2) 如果我在 ________ 上方有一个空行来调用 ffprobe 查询的输出以在我的 for 循环中使用,我应该使用什么?

最佳答案

for /f "tokens=1,2,3,4 delims= " %%a in (
 'ffprobe -v quiet -show_entries stream=index,codec_name,height -of csv "%%a" 2^>^&1 ^| findstr "hevc"'
) do set codec=%%b&set fheight=%%d

应该执行ffprobe您在 for 中指定的命令陈述。
, 可能还需要用插入符号^ 转义.

插入符号对重定向器字符进行转义,以便它们被接受为要执行的命令的一部分,而不是 for。本身。

要执行命令,请将其括在 'single quotes'

鉴于您建议的输出,我看不出它会通过 findstr筛选 hevc因为它不包含 hevc .此外,你提到的输出是逗号分隔的,所以 delims选项应该是 ,而不是 Space

for /?从文档提示中 - 以及关于 SO 的数千个示例。

关于windows - 如何从标准输出设置逗号分隔值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46990368/

相关文章:

.net - 使用 .NET (C#) 获取所有打开窗口的位置和大小

windows - 如何在字符 X - Windows 7 的每个实例中在文本文件中创建一个新行?

windows-7 - 从桌面或程序中调用时,相同的 BAT 文件表现不同

javascript - Youtube api - 停止视频

c++ - 为什么我在包含 windows.h 时收到错误 "WM_MENUCOMMAND was not declared in this scope"?

windows - Postgresql 配置文件 : 'postgresql.conf' on Windows? 在哪里

c++ - 函数指针和dll加载顺序

batch-file - 如何在bat文件中使用goto函数?

android - 调用 MediaRecorder.stop() 时卡住应用程序

video - FFmpeg 使用具有透明度和排除混合模式的 png