mic/client/README.md

3.2 KiB

클라이언트

Orange Pi Zero 2W에서 실행할 USB 마이크 송신기입니다.

초기 목표는 USB 마이크 입력을 ALSA로 캡처하고, Mac 수신기로 UDP 패킷을 보내 실제 소리가 나오는지 확인하는 것입니다.

현재 범위

  • C++17
  • ALSA 기반 캡처
  • UDP 송신
  • 로컬 WAV 백업 녹음
  • 단일 송신기
  • 무압축 signed 16-bit little endian PCM
  • 설정 파일 기반 Mac 수신기 주소 지정

자동 검색, 압축, 다중 송신기, 동기화, 지연 시간 최적화는 이후 단계에서 다룹니다.

필요 패키지

Orange Pi 공식 Debian 12 Bookworm Server 기준으로 다음 패키지가 필요합니다.

sudo apt update
sudo apt install build-essential cmake libasound2-dev

빌드

cd client
cmake -S . -B build
cmake --build build

설정

예시 설정 파일을 복사해서 사용합니다.

cp client.conf.example client.conf

주요 값:

server_host = 192.168.0.10
server_port = 4860
alsa_device = default
sample_rate = 48000
channels = 1
frame_ms = 20
record_enabled = true
record_dir = recordings

server_host는 Mac 수신기의 IP 주소로 바꿉니다.

초기 버전은 단일 포트 4860을 사용합니다. 이후 여러 포트가 필요해지면 4800-5000 범위 안에서 배정하는 방향으로 둡니다.

record_enabled의 기본값은 true입니다. 저장 위치는 실행 위치 기준 recordings/이며, 클라이언트가 실행될 때마다 새 WAV 파일을 만듭니다.

실행

./build/mic-client --config client.conf

종료는 Ctrl+C로 합니다.

로컬 녹음

클라이언트는 Wi-Fi UDP 송신과 동시에 로컬 WAV 파일을 저장합니다.

파일명은 녹음 시작 일자와 실행 시각을 기준으로 자동 생성됩니다.

recordings/mic-client-20260602-165000.wav

파일 분할은 하지 않습니다. 클라이언트가 재부팅되거나 재실행되면 새 파일을 만듭니다.

녹음 파일 생성, 디렉터리 생성, 파일 쓰기, 종료 시 WAV 헤더 갱신에 실패해도 클라이언트는 종료되지 않습니다. 이 경우 경고를 출력하고 로컬 저장 없이 Wi-Fi 송신을 계속합니다.

저장 용량은 48 kHz / 16-bit / mono 기준으로 1시간에 약 330 MB입니다.

마이크 확인

Orange Pi에서 USB 마이크 인식 여부를 먼저 확인합니다.

arecord -l
arecord -L

마이크가 default로 바로 잡히지 않으면 client.confalsa_device 값을 plughw:CARD,DEV 또는 hw:CARD,DEV 형태로 지정합니다.

패킷 형식

현재 클라이언트는 각 UDP 패킷 앞에 40바이트 헤더를 붙이고, 그 뒤에 PCM payload를 붙입니다.

헤더 숫자 값은 network byte order로 전송합니다. PCM payload는 signed 16-bit little endian입니다.

magic            4 bytes  "MIC1"
version          u16
header_size      u16
sequence         u64
timestamp_frames u64
sample_rate      u32
channels         u16
bits_per_sample  u16
frame_count      u32
payload_bytes    u32

서버 구현은 이 형식에 맞춰 UDP 패킷을 수신하고 PCM payload를 재생하거나 저장하면 됩니다.