关于ffmpeg:流的操作二如何选择流

9次阅读

共计 3031 个字符,预计需要花费 8 分钟才能阅读完成。

转发自白狼栈:查看原文

从流的操作(一)视频转音频引发的血案一文中咱们理解到,流的抉择,理论有两种形式,一种是 ffmpeg 主动抉择,一种是设置参数手动抉择。

对于主动抉择,ffmpeg 默认抉择规定如下:

  1. 视频流:默认抉择分辨率最高的流
  2. 音频流:默认抉择通道最多的流
  3. 字幕流:默认抉择第一个字幕编码器反对的字幕流

对于视频流和音频流,如果分辨率相等或者通道相等则以第一个为准,数据流和附件流不反对主动抉择,须要手动抉择。

主动抉择的状况下,ffmpeg 每种类型只会抉择一路,举个例子

ffmpeg -i r3.mp4 -hide_banner 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'r3.mp4': 
... 
Duration: 00:00:58.54, start: 0.000000, bitrate: 1998 kb/s 
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1732 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default) 
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default) 
Stream #0:2(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)

注:Stream #0:0,第一个 0 示意第一个输出文件,第二个 0 示意第一个输出文件的第一路流

如果咱们间接对 r3.mp4 转码操作,你会发现输入的视频只保留了一路视频和一路音频。

1、ffmpeg -i r3.mp4 tmp-r3.mp4 
2、ffmpeg -i tmp-r3.mp4 
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1684 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default) 
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)

这就是 ffmpeg 主动抉择的后果。

如果想要输出视频的 Stream #0:2 这路音频流,就只能手动指定了。

流的手动模式,应用 -map 参数操作,-map 十分重要,前面咱们还会重复应用它。它示意咱们须要从输出文件中抉择哪些流到输入文件。

语法规定:

-map [-]input_file_index[:stream_type_specifier][:stream_index]
  1. 中括号 [] 示意可选,input_file_index 之前的 – 示意反选,即能够剔除某一路流。
  2. input_file_index 指的是某个输出文件,咱们能够用下标 0 示意第一个输出文件,1 示意第二个输出文件,以此类推;
  3. stream_type_specifier(可选)指的是指定输出文件的某路流的类型,咱们用 a、v、s、d、t 别离示意音频流、视频流、字幕流、数据流和附件流;
  4. stream_index(可选)指的是具体的某个类型的某路流。

咱们依然以案例一的素材视频为例(没有下载的能够点击这里下载。

如果咱们以 r1ori.mp4 为输出,想得到 r3.mp4 的后果,即多了一路音频流且是 mp3 格局的,怎么做?

ffmpeg -i r1ori.mp4 -map 0:v -map 0:a:0 -map 0:a:0 -c:v copy -c:a:0 copy -c:a:1 libmp3lame -y r3.mp4

留神输入代码段 Stream mapping 这一段

Stream mapping: 
Stream #0:0 -> #0:0 (copy) 
Stream #0:1 -> #0:1 (copy) 
Stream #0:1 -> #0:2 (aac (native) -> mp3 (libmp3lame))

简略剖析下

  1. 因为只有一个输出文件,所以 -map 的第一个参数都是 0
  2. -map 0:v 示意抉择输出文件的所有视频流(这里视频流只有一个)到输入,-c:v copy 示意复制所有的视频流,即你看到的 Stream #0:0 -> #0:0 (copy)
  3. -map 00 咱们写了两遍,第一个示意抉择输出文件的第一个音频流到输入,第二个依然示意抉择输出文件的第一个音频流到输入,相当于输入了两路音频流
  4. -map 0:v -map 00 -map 00 连起来也有关系,示意要依照咱们抉择的这三路程序输入
  5. -c0 copy 针对第一个音频流进行复制,不从新编码,即 Stream #0:1 -> #0:1 (copy);-c1 libmp3lame 针对第二个音频流应用 libmp3lame 编码器从新编码,即输入过程中的 Stream #0:1 -> #0:2 (aac (native) -> mp3 (libmp3lame))

前面咱们还会大量应用 -map 命令,所以下面这段剖析,务必要了解分明。

下面的命令同样等价于

ffmpeg -i r1ori.mp4 -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 copy -c:a:1 libmp3lame -y r3.mp4

-map 0:v 这里等价于 -map 0:0,-map 00 等价于 -map 0:1,这是因为在 r1ori.mp4 中 #0:0 就是视频流,#0:1 就是音频流

ffmpeg -i r1ori.mp4 
... 
Stream #0:0(und): Video: h264 
Stream #0:1(und): Audio 
...

留神:-map 的参数,针对的是输出流,因为是咱们想要从输出流中抉择流到输入;- c 选项的参数,针对的并不再是输出流了,- c 的参数针对的是 -map 抉择的流,即输入流。

除此之外,上面咱们再看几个简略的例子,你能够在看后果之前尝试下

1、复制输出文件的所有流到输入,输入后果可就不止只有两路流了

ffmpeg -i r3.mp4 -map 0 -c copy output.mp4

2、把输出文件的三路流别离拆开,输入三个文件

ffmpeg -y -i r3.mp4 -map 0:v -c:v copy output-silent.mp4 \
-map 0:a:0 -c:a copy output-audio.aac \
-map 0:a:1 -c:a copy output-audio.mp3

咱们还能够设置一些选项,比方能够设置 r3.mp4 的两路音频流有不同的码率。

ffmpeg -i r3.mp4 -b:a:0 32k -b:a:1 64k -map 0 -y r4.mp4

-map 0 是必须的,不然输入后果并不会输入两路音频流。

对于音视频流还有很多选项设置,具体你能够查阅官网文档理解,你也能够在咱们平时练习中多查阅材料,奠定根底。

最初,咱们还有一种最最常见的操作——联合滤镜应用。

比方把原视频 r3.mp4 等比例缩放一倍

ffmpeg -i r3.mp4 -vf scale=272:480 -y filter.mp4

咱们也能够手动抉择流解决

ffmpeg -i r3.mp4 -filter_complex "[0]scale=272:480[out]" -map 0:a -map "[out]" -y filter.mp4

下面这两条命令你可能很难了解,对于滤镜,大家先有个印象,上面文章咱们再作具体介绍。

流的操作咱们就介绍到这里,大家在练习中碰到各种莫名其妙的问题,只管留言。

正文完
 0