i2s(일반 dmic 드라이버 사용)를 통해 사운드 입력이 있고 bluez5를 사용하여 블루투스 스피커에 연결되는 라즈베리 파이 0 w가 있습니다.
연결된 블루투스 장치를 alsa PCM으로 사용할 수 있도록 bluez-alsa를 설정했습니다. 이것은 작동하며 aplay를 사용하여 파일을 재생할 수 있습니다.
또한 arecord를 사용하여 입력을 녹음할 수도 있습니다.
내 현재 요구 사항은 다음과 같습니다
- 연속 i2s 입력을 기록하고 블루투스 alsa 출력으로 파이프합니다.
- 지연 시간은 최대한 낮아야 합니다.
- 음질이 좋아야 합니다.
i2s 입력의 샘플링 속도는 96khz 및 32비트인 반면, 대부분의 블루투스 스피커는 최대 48khz 및 16비트를 처리할 수 있습니다.
나는 alsaloop를 시도하고 arecord/aplay 방법을 결합했습니다.
alsaloop의 경우 다음 명령을 사용했습니다.alsaloop -C i2s-input -P "bluealsa:DEV=XX" -c 2 -r96000 -fS32_LE -t 20000
시간/버퍼/기간 매개변수를 사용할 때 지연을 상당히 낮은 값으로 설정할 수 있지만 매우 불안정합니다. 잠시 후, 버퍼 오버플로우와 언더런이 동시에 발생하고 소리가 이상해지기 시작하거나 완전히 실패합니다.
arecord와 aplay의 경우 다음과 같은 것을 시도했습니다.arecord -D i2s-device -c2 -r96000 -fS32_LE -traw | aplay -D "bluealsa:DEV=XX" -c2 -r96000 -fS32_LE -traw
잘 작동하지만 지연 시간이 상당히 길고 CPU 로드가 alsaloop보다 훨씬 높습니다. 그러나 간헐적으로 소리가 나는 xrun도 자주 발생합니다.
이 설정을 개선할 수 있는 제안 사항이 있습니까? 버퍼/기간 값은 정확히 어떻게 최적으로 설정되어야 합니까?
답변1
몇 가지 테스트 후에 해결책을 찾았습니다: sox
alsaloop 또는 arecord/aplay를 사용하는 대신 sox를 사용하여 간단한 파이프라인을 설정했습니다.
mkfifo /tmp/pipe
rec -b 32 -r 96000 --endian little -t raw -e signed-integer /tmp/pipe &
sox -b 32 -r 96000 --endian little -t raw -e signed-integer /tmp/pipe -t raw -e signed-integer -p rate 48000 | AUDIODEV="bluealsa:DEV=XX:XX:XX:XX:XX:XX" play -b 32 -r 96000 --endian little -t raw -e signed-integer -p &
그러면 명명된 파이프가 생성되고 /tmp/pipe
입력 rec
으로 채워져
sox
오디오 데이터를 리샘플링한 다음 play
재생됩니다 .