canaliza a saída de parec para sox

5

sox é provavelmente o único programa do Linux que continua a me frustrar. Ao mesmo tempo, estou impressionado com o que ele pode fazer, e gostaria de estar perto de ser fluente nisso, se não dominar isso.

Hoje, passei cerca de duas horas tentando obter sox para ler bytes de parec por meio de um pipe.

Os parec bytes são% pulseaudio "coletor". Para fazê-los fluir pelo pipe, usei esta resposta do askubuntu

Este é o comando que estou usando:

$ parec -d telephonControl.monitor | sox -b 16 -e signed -c 2 -r 44100 - -t pulse hmm.ogg silence 1 0.50 0.1% 1 2.0 0.1% :             newfile : restart

e este é o erro que recebo:

sox FAIL formats: can't determine type of  '-'
write() failed: Broken pipe

Além disso, oggenc os analisa bem:

parec -d telephonControl.monitor | oggenc -b 192 -o telephonControl.ogg --raw -
Encoding standard input to 
         "telephonControl.ogg" 
at approximate bitrate 192 kbps (VBR encoding enabled)

Não tenho absolutamente nenhuma ideia de como fazer sox digerir esses bytes.

$ parec -d telephonControl.monitor >> somebytes

$ soxi somebytes
soxi FAIL formats: can't determine type of file 'somebytes'

Mas eu sei que eles são áudio bruto, 16 bits assinados little endian, 2 canais 44100kHz:

$pacmd
>>> list-sink-inputs
1 sink input(s) available.
    index: 17
        driver: <protocol-native.c>
        flags: 
        state: RUNNING
        sink: 2 <telephonControl>
        volume: 0: 100% 1: 100%
                0: 0.00 dB 1: 0.00 dB
                balance 0.00
        muted: no
        current latency: 92.86 ms
        requested latency: 23.20 ms
        sample spec: s16le 2ch 44100Hz
        channel map: front-left,front-right
                     Stereo
        resample method: (null)
        module: 7
        client: 53 <ALSA plug-in>
        properties:
                media.name = "ALSA Playback"
                application.name = "ALSA plug-in"
                native-protocol.peer = "UNIX socket client"
                native-protocol.version = "26"
                application.process.id = "3609"
                application.process.user = "alec"
                application.process.host = "ROOROO"
                window.x11.display = ":0"
                application.language = "en_GB.UTF-8"
                application.process.machine_id = "eec7c6ae60f90bb3921ad16d0000302d"
                application.process.session_id = "eec7c6ae60f90bb3921ad16d0000302d-1345384044.64188-1149507345"
                module-stream-restore.id = "sink-input-by-application-name:ALSA plug-in"
    
por ixtmixilix 19.08.2012 / 17:54

1 resposta

7

A opção -t precisa ser antes do nome do arquivo ao qual se aplica. Além disso, -t pulse significa ler diretamente (ou gravar) no daemon PulseAudio; não é um formato de arquivo como tal. O nome do tipo para áudio bruto é raw .

Tente isto:

parec ... | sox -t raw -b 16 -e signed -c 2 -r 44100 - hmm.ogg ...

(onde ... significa manter os mesmos argumentos que você tinha antes)

soxi não pode identificar o tipo de arquivo porque tudo o que ele faz é olhar para o cabeçalho. O áudio bruto não tem um cabeçalho para ele olhar.

    
por 20.08.2012 / 00:21