Raspberry Pi에서 macOS로 라이브 사운드 보내기

Raspberry Pi에서 macOS로 라이브 사운드 보내기

라이브 재생을 위해 Raspberry Pi에 녹음된 사운드를 MacBook으로 파이프하고 싶습니다. 나는 다음을 시도했습니다 :

내 라즈베리 파이에서:

포트 3333에서 스트림을 설정하려고 합니다.

arecord -D plughw:3,0 -f S16_LE 44100 -t raw | nc -l -p 3333

내 MacBook에서:

nc 10.10.1.1 3333 | play -t raw -b 16 -e signed-integer -r 44100 -c 1 -V1 -

이를 통해 Mac에서는 아무 소리도 들리지 않지만 터미널에서는 다음과 같은 출력을 얻습니다.

-: (raw)

 File Size: 0
  Encoding: Signed PCM
  Channels: 1 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
  Duration: unknown

In:0.00% 00:00:00.00 [00:00:00.00] Out:0     [      |      ]        Clip:0
Done.

답변1

nc특정 사례에서 설정에 어떤 문제가 있는지 실제로 말할 수는 없습니다. 실제로 데이터를 수신하고 있는지(예: 파일에 쓰거나 파이핑하여 ) 실제로 캡처 pv하고 있는지 확인하고 싶습니다. arecord사운드(파이핑 대신 파일에 쓰기를 통해 nc)

또한 44100Hz가 우아한 샘플링 속도인지 확실하지 않습니다. 요즘 대부분의 하드웨어는 기본적으로 48000Hz에서 실행되므로 ALSA에서 이를 44100Hz로 변환하면 됩니다.

더 중요한 것은 수신 측이 스트림 형식 자체를 알고 시간을 올바르게 정렬하고, 손실을 보상하고, 손실을 지연하거나, 패킷을 재정렬할 수 있도록 하는 합리적인 전송 프레이머를 사용해야 한다는 것입니다. 저는 디지털 비디오 방송 및 기타 멀티미디어 스트리밍 플랫폼의 스트리밍 형식으로 MPEG Transport Stream을 사용하고 있습니다.

따라서 대기 시간이 짧은 전송을 위해 TCP를 사용하는 것도 좋은 생각이 아닙니다. 또한 네트워크 수신기(이 경우 ncRPi) 에서 사용하는 전송 버퍼 크기를 제한해야 합니다 . 전체적으로 이것은 arecord | nc최고의 스트리밍 방법이 아닐 수도 있습니다. 또한 접근 방식에서는 발신자가 일어나서 연결할 준비가 된 후 수신자가 시작하는 데 필요한 지연과 최소한 동일한 지연을 얻습니다.

일부 오디오를 빠르게 캡처하여 다른 컴퓨터로 전송해야 할 때(주로 웹 회의 목적으로) "마이크 컴퓨터"에서 다음을 수행합니다.

ffmpeg \
  -f alsa -channels 1  -sample_rate 24000 -i pipewire \
  -f mpegts -max_packet_size 1024 \
  -c:a libopus -b:a 64k -vbr off -packet_loss 10 -fec on \
  udp://127.0.0.1:1234

그것을 분석해 봅시다:

  • ffmpeg: 우리가 실행하고 있는 프로그램, FFmpeg. 대부분의 플랫폼에서 거의 표준 트랜스코딩/스트리밍/디코딩 솔루션입니다.

입력 옵션:

  • -f alsa: 입력 유형("형식")은 alsa입니다. 즉, alsa 사운드 시스템에서 사운드를 얻습니다.
  • -channels 1:임의로 선택할 수 있는나는 단지 모노 사운드를 원한다. 사운드 장치(아마도 스테레오?)를 사용하여 제공되는 모든 항목을 무시하거나, 특별히 다른 수의 채널을 캡처하려는 경우 다른 값으로 설정하십시오.
  • -sample_rate 24000:임의로 선택할 수 있는나의 주요 관심사는 음성입니다. 이 경우 24kHz 샘플링 속도는 탁월한 오디오 품질을 얻기에 충분합니다(저는 전혀 아니고, 제 목소리는 1.2kHz를 넘지 않습니다...).
  • -i pipewire: ALSA 장치에서 캡처되었습니다 pipewire. 귀하의 경우에는 plughw:3,0그런 것 같습니다. (사용 가능한 캡쳐 장치를 확인하는데 사용 arecord -L)

출력 형식 옵션:

  • -f mpegts: -i입력을 설명한 후 -f출력 형식을 설명합니다. MPEG 전송 스트림을 전송 중입니다.
  • -max_packet_size 1024:임의로 선택할 수 있는스트리머가 1024바이트마다 하나의 패킷을 내보내도록 강제합니다. 이는 발신자 대기 시간을 제한합니다.

오디오 코덱 옵션:임의로 선택할 수 있는

  • -c:a libopus:임의로 선택할 수 있는 ca오디오 libopus 인코더에서 사용되는 코덱의 약어입니다 , and here we use the. OPUS는 복잡성이 낮고 품질 설정이 뛰어난 성숙한 웹 표준 오디오 인코더입니다.
  • -b:a 64k:임의로 선택할 수 있는, 하지만 인코딩 비트 전송률을 64kb/s로 설정했습니다. 품질은 상당히 높지만 컴퓨팅 성능이 꽤 좋습니다(코어의 최대 5%~20%를 고려).
  • -vbr off:임의로 선택할 수 있는강제 상수( v가변 비트 전송률과 반대) 제한된 대역폭 링크를 통해 스트리밍할 계획이고 높은 속도에서 짧은 스파이크로 인코딩을 수행할 수 없는 경우 이는 의미가 있습니다. LAN에서는 생략되었습니다.
  • -packet_loss 10:임의로 선택할 수 있는패킷 10개 중 하나가 손실되더라도 문제가 되지 않도록 패킷 중복성을 설정하십시오. 가끔 패킷 손실이 발생하는 연결(예: 일부 인터넷 연결, 일부 무선 연결 등)에서 강력하게 만듭니다. LAN에서는 무시합니다.
  • -fec on:임의로 선택할 수 있는중복 정도를 설정한 후 실제로 이 중복의 전송 기능도 활성화하려고 합니다.에프앞으로이자형실수수정 목적. > 0 인 경우에만 의미가 있습니다 -packet_loss.

출력 옵션:

  • udp://127.0.0.1:1234스트리밍할 IP 주소와 포트입니다. 주목! 여기서 수신자는 청취 부분이고 송신자는 UDP 소켓이므로 오디오 스트림을 외부로 푸시하고 누군가가 듣는지는 상관하지 않습니다. 이것의 장점은 필요할 때마다 수신기를 연결하고 연결 해제할 수 있다는 것입니다.

수신 측에서는 청취 소켓을 엽니다.

ffplay -f mpegts -nodisp -fflags nobuffer udp://127.0.0.1:1234

-nodisp-fflags nobuffer입력 스트림 파서가 오래된 내용을 따라잡으려고 시도하지 않도록(예: "늦은 청취자" 지연을 피하기 위해) 디스플레이가 회전됩니다(비디오를 스트리밍하지 않음) .

이 경우 주의하시기 바랍니다.놀다end는 (당신이 했던 것처럼) 청취 소켓을 여는 서버입니다 nc -l. 원하는 경우 이전에 양쪽에서 zmq:tcp://사용한 위치를 사용하여 이를 되돌릴 수도 udp://있으며 서비스 "로거" pi에 여러 리스너를 연결할 수도 있습니다.

nc -u -l -p 1234 | …물론 MPEG TS를 이해하는 프로그램이라면 완전 자유롭게 사용하실 수 있습니다.

관련 정보