sox entre dois tubos

3

Estou tentando colocar o utilitário "sox" em um comando de dois canais para reamostrar um arquivo de áudio mono de 44kHz para um arquivo de áudio de 16kHz.

Funciona bem com um único tubo:

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k toto.wav

Mas quando eu adiciono um pipe, o utilitário sox reclama:

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k - | cat - > toto.wav
sox FAIL formats: can't determine type of '-'

Alguma ideia?

    
por SebMa 04.04.2016 / 12:01

2 respostas

3

Você precisa declarar o tipo de saída do sox adicionando -t wav antes do segundo - .

Quando é um nome de arquivo, o sox espreita o nome e deduz o tipo de lá, mas quando é stdout, o tipo precisa ser declarado.

Você também pode querer declarar todas as outras configurações ( -b 16 -e signed -c 1 ) ao invés de assumir que elas foram transferidas da entrada; tudo antes do último - que nomeia a saída.

    
por 04.04.2016 / 13:27
1

Quando você fornecer um nome de arquivo explícito, como toto.wav , o SoX deduzirá da extensão .wav que deve usar o formato WAV. No caso de - ser a saída "nome do arquivo", essa dedução não pode ser feita, portanto, você precisa especificar o tipo explicitamente com -t wav . O mesmo se aplica se você quiser dar ao arquivo uma extensão diferente ( toto.sound ) ou nenhuma ( toto ).

Em uma nota não relacionada, os arquivos WAV armazenam o tamanho do áudio contido no início do arquivo. No seu caso, o comprimento final não é conhecido quando essa parte do arquivo é gravada no canal. portanto, um valor indicando "comprimento desconhecido" será gravado. Isso pode ou não ser um problema, dependendo do que você deseja fazer com o arquivo.

    
por 04.04.2016 / 13:30

Tags