Eu suspeito que seus buffers de shell arecord
output antes que netcat
seja capaz de transmiti-lo (que é quando o cliente se conecta). Para confirmar, tente:
arecord | pv | netcat -l 10000 | aplay
No meu Ubuntu pv
mostra que arecord
produz pelo menos cerca de 60 KiB de saída (demora cerca de 8 segundos) mesmo se não houver conexão com netcat
. Você pode suspeitar que este buffer é implementado por pv
, mas não depende da opção pv -B
, então eu acho que é o buffer do shell para o pipe.
Eu tentei com stdbuf
e unbuffer
(o último do pacote expect-dev
no meu Ubuntu), mas os resultados foram insatisfatórios.
Eu obtive melhorias significativas quando usei dd
para liberar dados suficientes no lado do cliente :
arecord | netcat localhost 10000 | { dd bs=100K count=1 iflag=fullblock of=/dev/null; aplay; }
No meu caso 100K
foi suficiente; Sua millage pode variar. Note que você terá que esperar alguns segundos para que dd
termine se você executar o comando muito cedo (antes que o buffer esteja cheio no lado do servidor) ou se o parâmetro bs=…
for grande demais.