Вопрос Автоматически извлекать ВСЕ аудиопотоки из видеофайла в отдельные файлы?


у меня есть .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 of ffmpeg - а также так что расширения файлов автоматически назначаются (т. е. если это несжатый звук, то .wav, если он закодирован AAC, тогда .aac и т.д)
  • Какую команду я могу использовать, чтобы потоки были извлечены, как несжатое аудио, с теми же настройками, что и потоки? То есть результат test_s01.wav будет моно / 48,0 кГц / 16 бит, test_s02.wav будет также моно / 48,0 кГц / 16 бит и test_s03.wav будет стерео / 48,0 кГц / 16 бит?

2
2018-03-28 17:27


происхождения


У меня нет возможности проверить это здесь. Есть ли ffmpeg -i test.mov -vn -map 0:1 -acodec copy -y track1.wav дать вам трек 1? - infixed
Спасибо @infixed - действительно, это дает мне трек 1; Кстати, я нашел какое-то решение с ffmpeg (для меня avconv), см. мой пост ниже. Ура! - sdaau


ответы:


Хорошо нашел что-то с ffmpeg/avconv и .wav-файлы; это не совсем автоматическое, но это один-лайнер, извлекающий аудио. Во-первых, используйте ffprobe/avprobe как в OP, или ffmpeg -i/avconv -i получить информацию о потоке; от ОП:

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

... и, по крайней мере, в этом случае, полученные wavs имеют одинаковые свойства с потоками:

$ 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] copy [a1]; [0: 2] копировать [a2] '\
  -map '[a1]' -acodec copy test-01.wav \
  -map '[a2]' -acodec copy test-02.wav
... но это не с Stream specifier ':1' in filtergraph description [0:1] copy [a1]; [0:2] copy [a2] matches no streams., не понимают почему.


0
2018-03-28 20:42



Опять же, я не могу попробовать это сейчас, но если вы преобразовали файл в mkv формат mkvmerge -o tmp.mkv test.mov, вы можете просто вытащить все треки отдельно mkvextract tracks tmp.mkv - infixed
Аккуратный наконечник, @infixed, будет помнить об этом; ура! - sdaau
tmcd трек данных - это синхронизированный трек метаданных, а не аудио. sowt является twos назад и является просто ярлыком, разработанным Apple, для обозначения малоконтинентального 2-байтного (16 бит) несжатого PCM-звука, такого же, как PCM в WAV на Windows. - Gyan
дорожка данных - это что-то другое (другая дорожка MOV). Здесь третья звуковая дорожка, видимая в MediaInfo, представляет собой аудиопоток внутри поток DV, не обнаруженный FFmpeg. Demux the DV stream, воспроизведите его, и вы услышите этот «скрытый» аудиопоток (да, ваш видеопоток DV демультиплексирован, но вы получаете звук. DV - это «сложный» формат с видео и аудио вместе) - Jérôme Martinez