ffprobe选择音频和视频流

Ami*_*ali 7 ffmpeg ffprobe

我使用以下代码通过ffprobe提取视频信息:

ffprobe -show_streams -of json -v quiet -i input.mp4
Run Code Online (Sandbox Code Playgroud)

所有流的信息都出现在输出中,而我只需要v:0和a:0流的信息。

我知道有-select_streams选择流的选项,但它仅接受一个参数,例如:-select_streams v:0

我可以使用-select_streams两个参数v:0a:0也可以使用两次吗?

yar*_*nad 6

您可以简单地省略-select_streams参数并使用-show_entries参数传递您希望在输出中看到的字段,如下所示:

ffprobe -show_streams -show_entries format=bit_rate,filename,start_time:stream=duration,width,height,display_aspect_ratio,r_frame_rate,bit_rate -of json -v quiet -i input.mp4
Run Code Online (Sandbox Code Playgroud)

这应该给你一个类似于这样的输出:

{
    "programs": [

    ],
    "streams": [
        {
            "width": 360,
            "height": 202,
            "display_aspect_ratio": "16:9",
            "r_frame_rate": "2997/100",
            "duration": "68.601935",
            "bit_rate": "449366",
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0
            },
            "tags": {
                "language": "eng",
                "handler_name": "VideoHandler"
            }
        },
        {
            "r_frame_rate": "0/0",
            "duration": "68.475646",
            "bit_rate": "65845",
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0
            },
            "tags": {
                "language": "eng",
                "handler_name": "SoundHandler"
            }
        }
    ],
    "format": {
        "filename": "input.mp4",
        "start_time": "0.000000",
        "bit_rate": "522013"
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以从中索引到您想要的流,如 Powershell 中所示,以及返回的 JSON 对象流:

PS C:\Users\User> $json.streams[0]


width                : 360
height               : 202
display_aspect_ratio : 16:9
r_frame_rate         : 2997/100
duration             : 68.601935
bit_rate             : 449366
disposition          : @{default=1; dub=0; original=0; comment=0; lyrics=0; karaoke=0; forced=0; hearing_impaired=0; visual_impaired=0; clean_effects=0; attached_pic=0}
tags                 : @{language=eng; handler_name=VideoHandler}




PS C:\Users\User> $json.streams[1]


r_frame_rate : 0/0
duration     : 68.475646
bit_rate     : 65845
disposition  : @{default=1; dub=0; original=0; comment=0; lyrics=0; karaoke=0; forced=0; hearing_impaired=0; visual_impaired=0; clean_effects=0; attached_pic=0}
tags         : @{language=eng; handler_name=SoundHandler}
Run Code Online (Sandbox Code Playgroud)

您可以在此处从不同类型的流中获取关键字段名称列表:https : //trac.ffmpeg.org/wiki/FFprobeTips


thv*_*s86 6

我知道我参加晚会很晚,但万一其他人搜索类似内容(从此处):

ffprobe -show_streams -select_streams a INPUT
Run Code Online (Sandbox Code Playgroud)

其中一个代表音频和当然可以替换为:

  • v视频 ;
  • 一个:1音频数据包属于的音频流索引1 ;
  • v:99用于属于视频流索引为99视频数据包,依此类推。

请注意,如果要查看2个不同的流(例如音频和视频),则需要运行ffprobe两次。

对于更多的好东西,尽管写得很一般,但是您也可以查看:https : //trac.ffmpeg.org/wiki/FFprobeTips


Yoa*_*avG 6

我有一个类似的场景,我想将ffprobe -show_frames的输出限制为特定的音频和视频流。

看来-select_streams不能接受超过1个stream_specifier,也不能为同一ffprobe命令多次提供它。

而且,ffprobe不像ffmpeg那样接受-map参数。此参数允许ffmpeg处理特定的流,并且可以多次提供。

我最终要做的是使用ffmpeg -map过滤所需的流,并将输出通过管道传递ffprobe -show_frames,如下所示:

    ffmpeg -i INPUT -map 0:0 -map 0:1 -c copy -f matroska - | ffprobe -show_frames -
Run Code Online (Sandbox Code Playgroud)

几点注意事项:

  • 我在ffmpeg命令中使用了-f matroska,因为该混合器支持不可搜索的输出(stdout)
  • 所述-c复制是必要的,以避免所选择的流的代码转换。