Я подозреваю, что ваши буферы оболочки arecord
выводят до того, как netcat
сможет передать его дальше (когда клиент подключается). Для подтверждения попробуйте:
arecord | pv | netcat -l 10000 | aplay
В моем Ubuntu pv
показывает, что arecord
выдает не менее 60 Кбайт вывода (это занимает около 8 секунд), даже если нет подключения к netcat
. Вы можете подозревать, что этот буфер реализован pv
, но он не зависит от опции pv -B
, поэтому я думаю, что это буфер оболочки для канала.
Я пробовал использовать stdbuf
и unbuffer
(последний из пакета expect-dev
в моем Ubuntu), но результаты были неудовлетворительными.
Я добился значительного улучшения, когда использовал dd
для сброса достаточного количества данных на стороне клиента :
arecord | netcat localhost 10000 | { dd bs=100K count=1 iflag=fullblock of=/dev/null; aplay; }
В моем случае 100K
было достаточно; ваше измельчение может отличаться. Обратите внимание, что вам придется подождать несколько секунд для завершения dd
, если вы запустите команду слишком рано (до того, как буфер будет заполнен на стороне сервера) или если параметр bs =…
слишком большой.