如何从stdout设置逗号分隔值?

时间:2017-10-28 13:40:40

标签: 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循环?

1 个答案:

答案 0 :(得分:0)

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的{​​{1}}过滤器,因为它不包含hevc。此外,提及的输出是逗号分隔的,因此hevc选项应该是而不是空格

请参阅文档提示中的delims - 以及SO上的数千个示例。