elsa in mac

bluetooth 헤드폰/이어폰 사용 시, CAVA 와의 latency를 없애는 방법 본문

Terminal(CLI,TUI)

bluetooth 헤드폰/이어폰 사용 시, CAVA 와의 latency를 없애는 방법

elsa in mac 2025. 7. 15. 01:25

터미널 기반의 Cross-Platfom Audio Visualizer인 CAVA를 사용하신다면 참고해 보시기 바랍니다. 

이 방법은 Fedora Linux에서 확인한 방법입니다. 

음악이나 방송을 play하고, cava를 실행하면 오디오 신호에 따라 정확하게 반응하는 cava를 확인할 수 있습니다. 하지만, 만약 출력이 Bluetooth 헤드폰/이어폰 등으로 되어 있다면, 실제 Bluetooth 기기에서 듣는 음악 혹은 방송과 cava 간에 약간의 시간차가 발생한다는 것을 느낄 수 있습니다. 이것은 Bluetooth 수신장치의 출력지연(latency) 때문에 cava 가 실제 사용자가 듣는 소리보다 살짝 빠르게 반응하는 것처럼 보이기 때문입니다. 

이 둘간의 latency를 없앨 수 없을까?

bleutooth 장치의 출력지연을 줄일 수는 없으니, cava로 표시되는 시각적 반응을 반대로 latency를 늘려서 둘 간에 동기화를 시키는 방법밖에는 없습니다. 

이번 포스트는 CAVA의 출력에 인위적인 지연을 추가하여 무선 헤드셋과 동기화를 맞추는 방법에 관한 것입니다. 

우선, cava에는 출력을 지연시키는 delay 옵션이 없습니다. 따라서, cava의 입력을 bluetooth monitor pipe에서 직접 받지 않고, 중간에 input 단을 하나 만들고 이 input 단에서 일부러 delay를 줘서 cava에 전달하는 방식을 사용하면 됩니다. 

필자의 경우에 cava의 설정에서 [input] 단은 다음과 같이 설정되어 있습니다. 

# ~/.config/cava/config 

[input]
method = pulse
source = bluez_output.AC_12_2F_D5_33_A0.monitor

cava가 오디오 신호를 capture 하는 방식이 pulse 이고, source는 bluz_output의 연결된 bluetooth 기기의 monitor 라고 되어 있는 것이죠. 

위의 설정을 일단 주석처리(; 사용)하고,아래와 같이 fifo로 변경을 합니다. 

; ~/.config/cava/config 

[input]
; method = pulse
; source = bluez_output.AC_12_2F_D5_33_A0.monitor

method = fifo 
source = /home/elsa/.config/cava/delay_fifo  ; full path로 명시해야 함
sample_rate = 44100

그리고, 위의 설정대로 /home/elsa/.config/cava/ 폴더 에 delay_fifo 라는 FIFO를 생성해 줍니다.  /home/elsa 는 Fedora Linux에서 사용자 계정의 HOME directiory를 의미합니다. 본인에 맞게 수정해야 합니다. 

mkfifo /home/elsa/.config/cava/delay_fifo

잘 만들어졌는지 확인하려면, 아래와 같이 stat을 확인해 보면 됩니다. 

> stat ./delay_fifo
  File: ./delay_fifo
  Size: 0               Blocks: 0          IO Block: 4096   fifo
Device: 0,41    Inode: 16606164    Links: 1
Access: (0644/prw-r--r--)  Uid: ( 1000/    elsa)   Gid: ( 1000/    elsa)
Context: unconfined_u:object_r:config_home_t:s0
Access: 2025-07-15 00:54:46.730353315 +0900
Modify: 2025-07-15 00:54:46.784353073 +0900
Change: 2025-07-15 00:54:46.784353073 +0900
 Birth: 2025-07-14 23:00:00.204542896 +0900

중요한 것은 Access 에 0644/prw-r--r-- 로 되어 있다는 점. 

이제, pulse의 source(bluetooth 장치의 monitor)로 부터 받아서 이를 delay를 줘서 /home/elsa/.config/cava/delay_fifo에 쏴 주는 방법만 알면 됩니다. 그럼 cava는 해당 fifo를 읽어서 예전처럼 오디오 신호를 분석하고 그에 따라 반응을 하게 될 것입니다. 

방법은 ffmpeg을 사용하는 것입니다. 따라서, ffmpeg가 설치되어 있어야 합니다. 

 ffmpeg -f pulse -i bluez_output.AC_12_2F_D5_9C_A0.1.monitor -af "adelay=200|200" -f wav - > ~/.config/cava/delay_fifo

참고로, Bleutooth 모니터 소스 이름을 확인하려면, 터미널에서 아래와 같이 명령을 실행합니다. 

> pactl list sources short

56      alsa_output.platform-sound.HiFi__Headphones__sink.monitor       PipeWire        s32le 2ch 96000Hz       SUSPENDED
57      alsa_input.platform-sound.HiFi__Headset__source PipeWire        s32le 1ch 96000Hz       SUSPENDED
63      audio_effect.mini-convolver.monitor     PipeWire        float32le 2ch 48000Hz   SUSPENDED
10405   easyeffects_sink.monitor        PipeWire        float32le 2ch 48000Hz   SUSPENDED
10406   easyeffects_source      PipeWire        float32le 2ch 48000Hz   SUSPENDED
10551   bluez_output.AC_12_2F_D5_9C_A0.1.monitor        PipeWire        float32le 2ch 96000Hz   SUSPENDED
10552   bluez_input.AC:12:2F:D5:9C:A0   PipeWire        float32le 1ch 96000Hz   SUSPENDED

6번째 줄에 bluz_output_AC....monitor 가 있는 것을 알 수 있습니다. 이 이름을 그대로 사용하면 됩니다. 

ffmpeg... 명령을 내리고, 다른 터미널 창을 열고 cava를 실행하면 Bluetooth 헤드폰으로 들리는 소리와 cava가 얼추 동기화가 이뤄졌다는 것을 확인할 수 있을 것입니다.  그래도 cava와의 동기화가 잘 맞지 않는 것 같다면 , adelay=200|200 이 부분의 값을 변경하면서 확인하면 됩니다. 200|200은 각각 좌/우 채널의 지연 시간을 의미하는 것으로 단위는 ms 입니다. 

실제 사용 시에는 ffmpeg 와 cava를 한꺼번에 실행하도록 하는 것이 편리하므로, 아래와 같은 shell script를 만들어 사용하면 편합니다. 

# run-cava.sh 

#!/bin/bash

FIFO="$HOME/.config/cava/audio_delay_fifo"

[[ -p "$FIFO" ]] || mkfifo "$FIFO"

ffmpeg -v quiet -f pulse -i bluez_output.AC_12_2F_D5_9C_A0.1.monitor -af "adelay=200|200" -f wav - > ~/.config/cava/delay_fifo &
cava

이 shell-script를 실행하면, ffmpeg는 백그라운드로 실행이 되고, cava가 실행되게 됩니다.  이 스크립트에서 주목할 부분은 ffmpeg -v quiet 옵션이 추가되었다는 점입니다. ffmpeg가 실행되면 실시간 메시지들이 stderr로 끊임없이 출력되게 되는데, 이를 방지하기 위한 것입니다. 

 

- - - - 

그 동안, 무선 이어폰이나 헤드셋으로 음악 감상을 하면서, cava와의 latency 때문에 cava를 사용하기 꺼려 하셨다면 참고 하시기 바랍니다. 

 
공유하기 링크
Comments