自动将视频文件中的所有音频流提取到单独的文件中?

自动将视频文件中的所有音频流提取到单独的文件中?

我有一个.mov视频文件,ffprobe/avprobe报告:

$ avprobe -show_streams test.mov

    Stream #0.0(eng): Video: dvvideo, yuv420p, 720x576 [PAR 64:45 DAR 16:9], 28811 kb/s, PAR 236:162 DAR 295:162, 25.01 fps, 2500 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-08-27 09:10:44
    Stream #0.1(eng): Audio: pcm_s16le, 48000 Hz, 1 channels, s16, 768 kb/s
    Metadata:
      creation_time   : 2015-08-27 09:10:44
    Stream #0.2(eng): Audio: pcm_s16le, 48000 Hz, 1 channels, s16, 768 kb/s
    Metadata:
      creation_time   : 2015-08-27 09:10:44
    Stream #0.3(eng): Data: tmcd / 0x64636D74
Unsupported codec with id 0 for input stream 3
...
[streams.stream.1]
index=1
codec_name=pcm_s16le
codec_long_name=PCM signed 16-bit little-endian
codec_type=audio
codec_time_base=1/48000
codec_tag_string=sowt
codec_tag=0x74776f73
sample_rate=48000.000000
channels=1
bits_per_sample=16
...
[streams.stream.2]
index=2
codec_name=pcm_s16le
codec_long_name=PCM signed 16-bit little-endian
codec_type=audio
codec_time_base=1/48000
codec_tag_string=sowt
codec_tag=0x74776f73
sample_rate=48000.000000
channels=1
bits_per_sample=16
...
[streams.stream.3]
index=3
codec_name=unknown
codec_type=data
codec_time_base=0/1
codec_tag_string=tmcd
codec_tag=0x64636d74
avg_frame_rate=0/0
time_base=1/2500
start_time=0.000000
duration=32.760000
nb_frames=1
...

现在,从中我无法判断音频是如何编码的(如果它不是未压缩的),也无法判断这三个音频流是否是某种环绕声(其中一个也无法检测到) - 但我猜它们是因为mediainfo针对同一个文件的报告:

Audio #1 ...
Codec ID                                 : sowt
Channel(s)                               : 1 channel
Channel positions                        : Front: C
Sampling rate                            : 48.0 KHz
Bit depth                                : 16 bits
...
Audio #2 ...
Codec ID                                 : sowt
Channel(s)                               : 1 channel
Channel positions                        : Front: C
Sampling rate                            : 48.0 KHz
Bit depth                                : 16 bits
...
Audio #3 ...
Muxing mode, more info                   : Muxed in Video #1
Channel(s)                               : 2 channels
Sampling rate                            : 48.0 KHz
Bit depth                                : 16 bits
...

那么,有没有一个 Linux 命令行可以用来提取全部一次性从视频文件中获取这些音频流;也就是说,这个伪代码命令:

my_command --extract-all-audio-streams test.mov

...在这种情况下,应该产生与三个流相对应的三个音频文件。

尤其:

  • 我可以使用什么命令来提取流未皈依者从文件中,类似于-acodec copyffmpeg -这样就可以自动分配文件扩展名(例如,如果它是未压缩的音频,那么.wav,如果它是 AAC 编码的,那么.aac等等)
  • 我可以使用什么命令,以便将流提取为未压缩的音频,是否与流的设置相同?也就是说,结果test_s01.wav将是单声道/48.0 KHz/16 位,test_s02.wav也将是单声道/48.0 KHz/16 位,并且test_s03.wav将是立体声/48.0 KHz/16 位?

答案1

好吧,找到了一些带有ffmpeg/avconv和 .wav 文件的东西;它不是完全自动的,但它是提取音频的单行代码。首先,使用ffprobe/avprobe就像 OP 中那样,或者使用ffmpeg -i/avconv -i获取流信息;来自 OP:

Stream #0:0(eng): Video:
Stream #0:1(eng): Audio:
Stream #0:2(eng): Audio:
Stream #0:3(eng): Data:

因此,音频流是 0:1 和 0:2(注意ffprobe/avprobe写点.作为分隔符,ffmpeg -i/avconv -i写冒号:),我们希望将其保存为.wav文件 - 因此这是命令:

avconv -i test.mov \
  -map '0:1' -vn -acodec copy test-01.wav \
  -map '0:2' -vn -acodec copy test-02.wav

...并且至少就我的情况而言,产生的 wav 具有与流相同的属性:

$ mediainfo *.wav
...
Channel(s)                               : 1 channel
Sampling rate                            : 48.0 KHz
Bit depth                                : 16 bits
...
Channel(s)                               : 1 channel
Sampling rate                            : 48.0 KHz
Bit depth                                : 16 bits

现在在我看来,这两个“单声道”的“中心”通道实际上是左声道和右声道 - 而流 3,即使它被称为“音频”,它仍然是“数据”类型,所以也许它只是这些 L 和 R 单声道如何多路复用的描述符(根据报告mediainfo“多路复用模式,更多信息”)?!

不过,如果有一种工具可以自动完成这类工作那就太好了……


我本来认为必须使用过滤器,因此我尝试了这个:

avconv -i test.mov -filter_complex '[0:1] 复制 [a1];[0:2] 复制 [a2]' \ 
-map '[a1]' -acodec 复制 test-01.wav \
-map '[a2]' -acodec 复制 test-02.wav
...但是这失败了Stream specifier ':1' in filtergraph description [0:1] copy [a1]; [0:2] copy [a2] matches no streams.,真的不明白为什么。

相关内容