Extrai automaticamente TODOS os fluxos de áudio de um arquivo de vídeo para arquivos separados?

2

Eu tenho um arquivo de vídeo .mov , para o qual ffprobe / avprobe relatórios:

$ 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
...

Agora, a partir disso, não sei dizer como o áudio é codificado (se não estiver descompactado) e não sei dizer se esses três fluxos de áudio são algum tipo de som surround (e um deles também não pode ser detectado) - mas eu acho que eles são porque mediainfo relata o mesmo arquivo:

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
...

Então, existe uma linha de comando do Linux que eu poderia usar, para extrair todos destes fluxos de áudio do arquivo de vídeo de uma só vez; isto é, este comando pseudocódigo:

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

... deve resultar, neste caso, com três arquivos de áudio correspondentes aos três fluxos.

Em particular:

  • Qual comando eu poderia usar, para que os fluxos sejam extraídos unconverted do arquivo, semelhante a -acodec copy do ffmpeg - e para que as extensões de arquivos sejam atribuídas automaticamente (ou seja, se for um áudio descompactado, então .wav , se for codificado por AAC, então .aac etc)
  • Qual comando eu poderia usar para que os fluxos fossem extraídos convertidos como áudio não compactado , com as mesmas configurações dos fluxos? Ou seja, o test_s01.wav resultante seria mono / 48,0 KHz / 16 bits, test_s02.wav seria também mono / 48,0 KHz / 16 bits e test_s03.wav seria estéreo / 48,0 KHz / 16 bits?
por sdaau 28.03.2016 / 19:27

1 resposta

0

Bem, encontramos algo com os arquivos ffmpeg / avconv e .wav; não é exatamente automático, mas é uma linha extraída do áudio. Primeiro, use ffprobe / avprobe como no OP ou ffmpeg -i / avconv -i para obter as informações do fluxo; do OP:

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

Assim, os fluxos de áudio são 0: 1 e 0: 2 (observe ffprobe / avprobe escreve ponto . como separador, ffmpeg -i / avconv -i escreve dois pontos : ) e os fluxos queremos salvar como .wav arquivos - então este é o comando:

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

... e pelo menos neste caso meu, os wavs resultantes têm propriedades idênticas com os fluxos:

$ 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

Agora parece que esses dois canais "mono" são canais da esquerda e da direita - e o fluxo 3, mesmo que seja chamado de "Audio", ainda é tipo "data", e talvez seja apenas um descritor de como esses canais mono L e R são multiplexados (como no relatório mediainfo "modo Muxing, mais informações") ?!

Ainda assim, seria ótimo saber se há uma ferramenta que possa fazer esse tipo de coisa automaticamente ...

Eu teria pensado que é preciso usar filtros, então eu tentei isso:

avconv -i test.mov -filter_complex '[0:1] copy [a1]; [0:2] copy [a2]' \
-map '[a1]' -acodec copy test-01.wav \
-map '[a2]' -acodec copy test-02.wav
... mas isso falha com Stream specifier ':1' in filtergraph description [0:1] copy [a1]; [0:2] copy [a2] matches no streams. , realmente não entendo porquê.

    
por 28.03.2016 / 22:42