Piping Sox e FFMPEG juntos

3

Estou processando uma variedade de arquivos de áudio em vários formatos diferentes e gostaria de unificar seu formato e configuração usando o FFMPEG e o SoX.

Existem dois passos para o meu processo:

  1. Converta o arquivo, o que quer que seja originalmente, em um arquivo WAV little-endian de 16 bits do PCM:
    ffmpeg -i input.wav -c:a pcm_s16le output.wav
  2. Processe o arquivo no Sox para torná-lo compatível com a taxa de amostragem e a contagem de canais de que precisamos:
    sox input.wav output.flac channels 2 rate 44.1k

Eu gostaria de passar esses dois comandos juntos para evitar a criação de um arquivo desnecessário.

Estou tendo muita dificuldade para fazer o formato funcionar corretamente, no entanto.

O SoX reclama que precisa conhecer explicitamente o formato do áudio de entrada, algo que nem sei em tempo de execução. Eu conheço o formato do áudio PCM, mas não tenho certeza da contagem de canais nem da taxa de amostragem do áudio recebido.

Existe uma maneira de canalizar esses dois comandos juntos, ou melhor, apenas usar uma ferramenta para o trabalho?

A razão pela qual usei duas ferramentas, em vez de apenas tentar fazê-lo com uma:

FFMPEG

  • Não tenho certeza se existe uma maneira de converter com segurança um fluxo de áudio mono em um fluxo de áudio estéreo, duplicando os canais. (SoX faz isso nativamente).
  • Não sabe como alterar a taxa de amostragem. (SoX faz isso nativamente).
  • Não sabe como enviar para o FLAC usando a melhor taxa de compactação.

SoX

  • Não é possível fazer a detecção do formato de áudio, assim como o FFMPEG. Se eu tiver um arquivo sem uma extensão, o SoX me pedirá para especificar manualmente o formato, que não funciona para o meu aplicativo.
por Naftuli Kay 05.11.2013 / 01:03

1 resposta

2

Acho que sox precisa buscar sua entrada para determinar o formato de entrada do cabeçalho do arquivo e isso é incompatível com um canal.

Eu acho que o ffmpeg pode fazer tudo o que você quiser, embora eu não tenha certeza. Eu não estou familiarizado com isso e a documentação é clara como lama.

ffmpeg -i "$input" -compression_level 9 -ac 2 -ab 44100 output.flac

Alternativamente, o mencoder deve ser capaz de fazer um trabalho similar.

mencoder "$input" -oac lavc -lavcopts=acodec=flac:abitrate=44.1:o=compression_level=9 -af channels=2 output.flac
    
por 06.11.2013 / 01:16

Tags