ffmpeg的一些选项是可以作用到具体的stream上的,比如编解码器,是可以指定具体的哪个流用哪种编解码器的。所以需要一种方式能指定具体的流,也就是Stream specifiers。

Stream specifiers追加在选项后面,两者通过冒号隔开。比如:-codec:a:1 ac3,指的是对于第二个音频流,使用ac3编解码器。

Stream specifiers还可以同时指定多个流,比如:-b:a 128k就选中了所有的音频流。

如果不指定Stream specifiers,则选项会应用到素有流上,比如:-codec copy-codec: copy

Stream specifiers可以有一下几种格式:

  • stream_index

    流的索引,从0开始。比如:-threads:1 4设置第二个流用的线程数为4

  • stream_type[:stream_index]

    stream_type为流的类型,可选值有:

    1. vV匹配视频(v匹配所有视频流,V只匹配视频流而不匹配衍生的附加图片,视频缩略图,封面等)
    2. a匹配音频
    3. s匹配字幕
    4. d匹配data
    5. t匹配附件

    如果指定了[:stream_index]则匹配对应的类型的第几个流,否则匹配这个类型的所有流。

  • p:program_id[:stream_index]

通过program_id指定对应的程序。(不是很明白)

  • #stream_id或者i:stream_id

通过流的stream_id直接匹配流(有些格式支持这种特性)

  • m:key[:value]

匹配元数据包含有key的流,如果指定了[:value],则还要求值要匹配。

  • u

通过配置匹配流(可能有些编解码器支持,不是很明白)

参考资料