我有一个.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 copy
ffmpeg -和这样就可以自动分配文件扩展名(例如,如果它是未压缩的音频,那么.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.
,真的不明白为什么。