그래서 저는 netcat
음성 통화를 설정할 수 있는 간단한 실험을 하고 있습니다. 이것이 내가 사용하는 명령입니다.
섬기는 사람:
arecord | netcat -l 10000 | aplay
고객:
arecord | netcat localhost 10000 | aplay
내 문제는 클라이언트가 연결되기 몇 초 전에 서버가 시작될 때 서버에서 음성이 지연된다는 것입니다. 이 지연을 제거하는 방법을 알고 싶습니다. 에서 몇 가지 값을 설정하면 될 것 netcat
같은데 어떤 값을 설정해야 할지 잘 모르겠습니다.
저는 UDP와 TCP를 사용했습니다. 둘 사이에는 차이가 없습니다.
답변1
귀하의 쉘이 출력을 더 이상 전달하기 arecord
전에(즉, 클라이언트가 연결될 때) 출력을 버퍼링하고 있는 것 같습니다 . netcat
확인하려면 다음을 시도해 보세요.
arecord | pv | netcat -l 10000 | aplay
내 우분투 에서는 pv
.arecord
netcat
pv
pv -B
stdbuf
나는 and unbuffer
(후자는 expect-dev
내 우분투 패키지에 있음)를 사용해 보았 으나 결과가 만족스럽지 않았습니다.
dd
다음을 사용하여 충분한 데이터를 새로 고쳤을 때 상당한 진전이 있었습니다.클라이언트에서:
arecord | netcat localhost 10000 | { dd bs=100K count=1 iflag=fullblock of=/dev/null; aplay; }
나에게는 충분합니다 100K
. 귀하의 마일리지는 다를 수 있습니다. 명령을 너무 빨리 실행하는 경우 dd
(서버 측 버퍼가 가득 차기 전) 또는 매개변수가 bs=…
너무 큰 경우 명령이 완료될 때까지 몇 초 정도 기다려야 합니다.
답변2
TCP를 사용하면 데이터가 손실되지 않도록 연결이 "보장"됩니다. 귀하의 경우 클라이언트와 서버가 데이터 손실을 피할 수 있는 유일한 방법은 배달을 위해 대기열에 넣는 것이기 때문에 이 작업을 원하지 않을 것입니다.
두 시스템 모두 UDP를 사용하도록 전환할 수 있습니다. 이는 연결이 없기 때문에 첫 번째 패킷을 대기열에 넣지 않지만 삭제됩니다. 지금은 테스트할 수 없지만 다음을 시도해 보시기 바랍니다.
시스템 1의 서버
arecord | nc -u -l -p 10000 | aplay
시스템 2의 클라이언트
arecord | nc -u system1 10000 | aplay