본문 바로가기

ISSUE

[ISSUE] AVFoundation ( 1 ) - AVPlayer

현재 진행하는 프로젝트에서 
mp3파일의 음원을 실시간으로 재생하며
컨트롤 해야하는 부분이 있었다.

필자는 사전에 AVPlayer를 사용하여
사용자가 만든 음악을 공유하며 들어볼수 있는 앱을
개인 토이 프로젝트로 만든 경험이 있어
AVPlayer로 진행해야겠다고 생각했고
player를 구현하는 과정에 있어서 많은 issue들이 생겼다.

그리고 해결 했던 과정을 몇편에 나눠 포스팅 해보려한다.

 

AVPlayer로 동일하게 진행했었지만

사전에 진행했던 토이프로젝트에서 사용하던 Firebase URL이

정상적으로 duration을 가지고 올수 있었던 것과는 반대로

필자가 전달 받은 프로젝트에 사용한 url은

playerItem으로부터 제공받는 duration을 가지고 오지 못해

문제가 발생했다.

 

오디오가 정상적으로 재생이 되는 동안

특정 시간대에 추가적인 액션을 취할 수 있게끔 해주는 메소드인

addBoundaryTimeObserver 내부에서 (1초 후 라는 특정 시간대를 설정해놓음)

duration은 nan이었고

혹시나 URL마다 상이해 stream으로 URL을 연결하는 네트워킹 과정에서 delay가 발생했을까 싶어

1초가 아닌 10초 후까지 지연후에 duration을  찍어봤음에도 duration은 nan이었다.

 

player의 currentItem.status가 .readyToPlay 일때 실행하라는 등,

AVAsset을 사용하여 AVPlayerItem을 만들라는 등

구글링을 해서 찾은 답변들로 시도를 해봐도

여전히 duration은 감감무소식이었다.

 

AVPlayer Item get a nan duration

I'm playing a file. mp3 from url by stream. I'm using AVPlayer and when I am trying to get the total time to build a progress bar, I get whenever time is nan. NSError *setCategoryError = nil; ...

stackoverflow.com

 

필자의 FirebaseURL은 정상적으로 처리했는데

전달 받은 URL은 진행이 안된다는게 이상해서

계속되는 삽질 도중

player의 currentItem에 뭔가 조작 가능성에 관련된 Bool 타입의 여러 속성들이 있는것을 발견했다.

발견 즉시 Log를 찍어봤고 

Firebase URL은 전부 true를 반환하는 반면

전달 받은 URL은 전부 false를 반환 받았다.

 

이거다 싶어 구글에 떠도는 mp3URL을 모아서

모두 실험해봤는데 

 

true를 반환하는 녀석들(duration을 가지고 올 수 있는 주소들)은 

URL을 주소창에 다이렉트로 접근했을때 이런 play화면을 보여줬고

 

false를 반환하는 녀석들(duration을 가지고 오지 못하는 주소들)은

주소창에 URL을 입력하고 접근했을때

바로 데스크탑에 다운로드로 이어지거나

재생방식이 live streaming 형식으로 이루어저 있었다.

 

 

최종적으로 

서버에 Upload 되어있는 mp3 파일의 포멧의 상이함에 있어

발생하는 issue로 판단했고

서버측에 audioFile Format 변경을 요청할 상황이 안되어서

AVPlayer를 이용한 기능 구현은 중단했으며

AVAudioPlayer로 다시 시작하게 되었다.

 

다음 게시물에는 AVAudioPlayer로 바꾸면서 일어난 issue에 대해서 포스팅하겠다.