티스토리 뷰

반응형

앱에서 버튼음과 같은 효과음을 넣기 위해 audioplayers 패키지를 사용했다. 

하지만 자잘한 문제들이 있어, 나중에 기억 못할 까봐 남겨보려 한다. 

 

1. PlayerMode .lowLatency 를 사용할 경우, 불편한 로그 메시지들이 쭈~~~욱

audioplayer의 setPlayMode와 관련하여 소스코드 주석을 보면, 낮은 지연을 위해서는 lowLatency모드를 사용하라고 되어있지만 실제로 적용해서 돌려보면 많은 log 메세지를 남긴다. 앱은 돌아가지만 뭔가 boundary를 넘어섰다고 하고, 어쩌고 저쩌고...은근 신경 쓰인다. 이걸 고칠 방법이 있나 찾아보니, 아래글에서처럼 lowLatency 쓰지 말란다. 

참고 자료: https://github.com/bluefireteam/audioplayers/issues/335

그래서 palyMode 설정하는 부분 삭제하니 log 창이 깔끔해졌다. 음원 플레이 delay는 측정해보지 않았지만 차이는 별로 못느끼겠다. 1-2초 이하의 짧은 효과음이라 그런지. 

 

2. stop()  사용하기

음원파일을 play하면, audioplayer의 state는 playing 이 된다. 이 state를 stopped로 바꾸지 않으면 다시 버튼을 눌렀을 때 효과음이 play이 안된다. 

그렇다고, 

await play( );

await stop( );

을 할 수도 없다. 음악이 실행되기 전에 stop되 버려서, 여전히 효과음을 들을 수 없다. 

github의 issues에 글을 보면 play하기 전에 stop을 한번 해주라고 되어있다. 

하지만 그렇게 했을 때, iOS에서 문제가 발생 했다. 어떤 효과음이 플레이 되고 난 후, 홈 버튼을 눌러 app을 backgound로 보냈다가 다시 앱을 foreground로 돌렸을 때, UI가 뜸과 동시에 방금전(마지막에 play되었던) 효과음이 play되는 것이었다.

이 문제는 app이 backgroud로 가기전에 audioplayers.release하거나 audioplayers.stop을 하면 해결되는 것까지는 확인했다. 그런데 발생원인이 audioplayers의 문제인지, flutter와 iOS 연결되는 부분에서의 문제인지 확인하지 못했다. 이것 때문에 해결하려고 2-3시간 썼다.

 

https://stackoverflow.com/questions/51835039/how-do-i-check-if-the-flutter-application-is-in-the-foreground-or-not

위의 링크 내용처럼 앱의 lifecycle을 인지해서 pause 될 때 stop을 실행하면 되겠지만 ,그럴러면 모든 page UI를 statefulWidget으로 만들고 WidgetBindingObserver를 mixin 한다음에 initState, dispose, didAppcycleChanged를 정의해줘야한다. 

 

 

하나의 page UI를 그렇게 만들어보고 제대로 동작하는 것까지는 확인을 했지만....정답은 아닌것 같다. 

 

그래서 play가 끝나는 것을 detect할 수 있는지 찾아보았다. 다행히 있었다. 

https://stackoverflow.com/questions/66706577/how-to-check-audio-is-finished-or-not-in-just-audio-library

 

How to check Audio is finished or not in just audio library?

How to check audio is completed or not? On finished change icon from pause to play.

stackoverflow.com

audioplayers의 경우, 아래 코드처럼 onPlayercompleteion 메소드가 있었다. 

player.onPlayerCompletion.listen((event) {
    onComplete();
    setState(() {
      position = duration;
    });
  });

혹시나 audioCache에 여러 파일이 들어있어서, 그중 하나의 음악파일만 play 했을 때  complete로 event를 발생시킬까 싶었는데 잘 동작한다. 

휴~...4시간 썼다... 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함