본문 바로가기

일상

안드로이드에서 배경음 반복 재생 때 이음매가 뚝 끊길 때 (MediaPlayer 반복 무음과 ExoPlayer 한 곡 반복)

반응형

플러터(Flutter) 앱에서 audioplayers 로 배경음을 ReleaseMode.loop 반복으로 틀었는데, 안드로이드에서만 곡이 끝나고 처음으로 돌아가는 순간 소리가 뚝 끊기는 문제를 해결하는 방법입니다.


개인 게임 앱에 70초 남짓한 배경음을 넣고 반복으로 틀어 두었는데, 플레이하다 보면 곡이 끝나고 새로 시작할 때마다 잠깐 끊기는 느낌이 났습니다. 음악이 이어져야 할 자리에서 박자가 한 번 빠지니, 게임 화면은 멀쩡한데도 어딘가 고장 난 것처럼 들렸습니다.


- 원인은 음원 파일이 아니라 안드로이드 MediaPlayer 의 반복(setLooping) 이었다

- 녹음해서 재 보니 반복할 때마다 81.75ms 무음이 끼어 있었다

- 안드로이드만 ExoPlayer 의 한 곡 반복(REPEAT_MODE_ONE) 으로 바꾸자 이음매가 사라졌다


1. 먼저 음원 파일부터 의심하기

반복 이음매가 끊기면 대개 파일을 먼저 봅니다. MP3 는 인코딩할 때 앞뒤에 짧은 무음이 붙는 일이 흔하고, 곡 끝에 페이드아웃이 들어 있거나 반복 길이가 마디와 안 맞아도 끊긴 것처럼 들리기 때문입니다.



그래서 파일을 PCM 으로 풀어 앞뒤 무음 길이와 끝부분 음량을 재 봤는데, 앞뒤 모두 무음이 없었고 끝에 페이드도 없었습니다. 반복 길이도 마디 단위로 딱 떨어져서, 파일만 놓고 보면 끊길 이유가 없는 상태였습니다.


2. 실제로 나오는 소리를 녹음해서 재기

귀로만 판단하면 "조금 끊기는 것 같다"에서 더 나아가지 못하니, 에뮬레이터에서 나오는 소리를 그대로 녹음해 원본과 맞춰 보기로 했습니다. 녹음을 0.5초 조각으로 잘라 원본의 어느 위치와 가장 닮았는지 찾고, 녹음 시각과 원본 위치의 차이를 쭉 찍어 보는 방식입니다.



틈 없이 재생되면 이 차이는 계속 같은 값이어야 하는데, 곡이 처음으로 돌아가는 지점마다 81.7ms 씩 늘어났습니다. 두 번 반복할 때 두 번 다 같은 값이라, 재생기가 반복할 때마다 일정한 무음을 넣고 있다고 볼 수 있었습니다.


audioplayers 의 안드로이드 쪽 소스를 보면 ReleaseMode.loop 는 결국 MediaPlayer 의 isLooping = true, 곧 setLooping(true) 를 부르는 것이라, 이 틈은 플러터가 아니라 MediaPlayer 의 반복 방식에서 생긴 것입니다.


3. ExoPlayer 의 한 곡 반복으로 바꾸기

ExoPlayer(androidx media3)는 반복할 때 다음 회차를 미리 읽어 두고 이어 붙이기 때문에 이음매에 틈이 생기지 않습니다. 그래서 효과음은 그대로 두고, 안드로이드의 배경음만 MethodChannel 로 네이티브 ExoPlayer 에 넘겼습니다.



setAudioAttributes 의 두 번째 인자를 false 로 둔 것은 오디오 포커스를 잡지 않으려는 것으로, 게임 배경음 때문에 사용자가 듣던 다른 앱의 음악이 끊기면 안 되기 때문입니다. 원래 audioplayers 설정도 포커스를 잡지 않게 되어 있었으니 동작은 그대로 맞춘 셈입니다.


같은 방법으로 다시 녹음해 보니 반복 지점의 어긋남은 57샘플, 약 1.3ms 로 측정 오차 수준이었고 튀는 소리도 없었습니다.


4. 같이 잡은 것: 곡이 바뀌었다 돌아오면 처음부터 다시 나올 때

이 앱은 보스전에서 보스 곡으로 바꿨다가 보스를 잡으면 원래 곡으로 돌아오는데, 돌아올 때마다 원래 곡이 처음부터 다시 나와서 이것도 끊겼다 다시 나오는 느낌을 줬습니다. 곡을 바꿀 때마다 재생기를 새로 만들어 처음부터 틀었기 때문입니다.


곡마다 재생기를 하나씩 두고, 바꿀 때는 이전 곡을 정지(stop)하지 않고 일시정지(pause)만 하도록 고쳤습니다. 돌아오면 멈춘 자리부터 이어서 나오고, 보스를 금방 잡아 곡이 짧게 왔다 갔다 하지 않도록 0.8초 기다렸다가 그때도 같은 곡이어야 바꾸게 했습니다.


5. 정리

안드로이드에서 배경음 반복 이음매가 끊긴다면 파일의 앞뒤 무음부터 확인하고, 파일이 깨끗한데도 끊기면 재생기를 의심해 볼 만합니다. 이번에는 MediaPlayer 반복이 매번 81.75ms 무음을 넣었고, ExoPlayer 의 REPEAT_MODE_ONE 으로 바꾸자 틈이 사라졌습니다.


측정은 안드로이드 에뮬레이터에서 했고, iOS 는 audioplayers 반복을 그대로 쓰고 있어 같은 문제가 있는지는 확인하지 않았습니다. "끊기는 것 같다"는 느낌은 녹음해서 원본과 맞춰 보면 숫자로 바뀌니, 소리 문제도 귀보다 측정으로 먼저 가르는 편이 빨랐습니다.


여기까지 안드로이드 배경음 반복 이음매 끊김에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!

반응형