batch-file - ffprobe 如何检索音频和视频信息并输出到单行?

标签 batch-file ffmpeg ffprobe

我可以使用以下内容来检索音频和视频编解码器以及视频帧高度:

ffprobe -v quiet -show_entries stream=index,codec_name,height -of csv input.mp4

但输出是两行,包括我不需要的文本,如下所示:
stream,0,h264,720
stream,1,mp3

我想要的唯一输出是以下形式:
mp3,h264,720

我已经尝试在同一命令行中使用 -show_entries 两次,但它每次都会忽略第一次调用。我也尝试过使用
ffprobe -v quiet -select_streams v -show_entries stream=codec_name,height, -select_streams a -show_entries stream=codec_name

但这无济于事。

如何获得上面指定的简化输出?

最佳答案

在我们在评论中进行对话之后,我认为您正在寻找这样的东西。这是一个 Batch + JScript 混合脚本。我正在使用 JScript 通过 ffprobe 解析和对象化 JSON 输出.盐调味,去除echo当您准备好执行脚本时,从第 31 行开始。

@if (@CodeSection == @Batch) @then
@echo off & setlocal & goto run

:usage
echo Usage: %~nx0 infile outfile
echo This script re-encodes videos to x265 + AAC encoding.
exit /b

:run
if "%~2"=="" goto usage
if not exist "%~1" goto usage

set ffprobe=ffprobe -v quiet -show_entries "stream=codec_name,height" -of json "%~1"

for /f "delims=" %%I in ('%ffprobe% ^| cscript /nologo /e:JScript "%~f0"') do set "%%~I"

if %height% lss 720 (
    echo Video is ^< 720p.  Not worth it.
    exit /b
)

set "pre=-hide_banner -fflags +genpts+discardcorrupt+fastseek -analyzeduration 100M"
set "pre=%pre% -probesize 50M -hwaccel dxva2 -y -threads 3 -v error -stats"
set "global="
set "video=-c:v libx265 -crf 22 -preset fast"
set "audio=-c:a libfdk_aac -flags +qscale -global_quality 4 -afterburner 1"

if defined hevc if defined aac (
    echo Already in x265 + AAC format.
    exit /b
)

if defined aac (
    echo Already has AAC audio.  Re-encoding video only.
    set "audio=-c:a copy"
) else if defined hevc (
    echo Already has x265 video.  Re-encoding audio only.
    set "video=-c:v copy"
)

echo ffmpeg %pre% -i "%~1" %global% %video% %audio% "%~2"

goto :EOF
@end // end Batch / begin JScript

var stdin = WSH.CreateObject('Scripting.FileSystemObject').GetStandardStream(0),
    htmlfile = WSH.CreateObject('htmlfile'),
    JSON;

htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
htmlfile.close(JSON = htmlfile.parentWindow.JSON);

var obj = JSON.parse(stdin.ReadAll());

for (var i = obj.streams.length; i--;) {
    if (obj.streams[i].height) WSH.Echo('height=' + obj.streams[i].height);
    if (/hevc/i.test(obj.streams[i].codec_name)) WSH.Echo('hevc=true');
    if (/aac/i.test(obj.streams[i].codec_name)) WSH.Echo('aac=true');
}

关于batch-file - ffprobe 如何检索音频和视频信息并输出到单行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45086424/

相关文章:

windows - 从批处理文件中使用 weka

windows - 使用bat脚本删除除一个文件循环外的所有文件

html - 如何使用批处理文件在 HTML 文件中写入 "greater than symbol"

ffmpeg - 从 x264 基线 420 配置文件编码 IPIPIP 帧

ffmpeg - 使用 ffmpeg 使用 DNXHD 编解码器将 jpg 转换为 mov 时出错

video - 一次覆盖并组合ffmpeg

c# 处理参数和缺少输出

python - 如何在不下载完整视频的情况下获取在线视频的时长?

audio - 当我将无声音频 (mp3) 附加到现有音频列表时,最终音频会出现乱码?

windows - xcopy 和 xcacls 脚本