2014-02-28 2 views
1

SPPlaybackManager를 사용하여 트랙을 재생하고 있지만 작지만 중요한 재생 측면에서는 힘든 시간을 보내고 있습니다. 트랙이로드 및 스트리밍 중이지만 SPAsyncLoading의 콜백 함수가 호출 된 후 .25 - 1.25 초 후에 재생되기 시작합니다. 트랙이 실제로 재생되기 시작하는시기를 확인하기 위해 여러 가지 방법을 시도했지만, 모두 SPAsyncLoading 콜백 (playbackManager.isPlaying, playbackManager.currentTrack 등)이 호출 된 순간 재생이 시작되었음을 나타냅니다. 실제로 앞서 언급 한 간단한 대기 시간 후에 SPSTyncLoading 콜백에서 10 초 동안 실행되도록 NSTimer를 설정하고 10 초 후에 playbackManager.trackPosition을 가져 와서 차이를 찾는 것으로 재생이 시작됩니다. TL; DR - CocoaLibSpotify가 시작될 때 재생이 실제로 시작되지 않습니다.SPPlaybackManager - 대기 시간 및 로딩

다음과 같은 몇 가지 문제가 발생합니다. 가장 먼저 중요한 점은 콜백과 재생 사이에 어떤 오프셋이 있었는지에 따라 노래가 맨 끝에 잘 리게됩니다. 둘째, UX 관점에서 볼 때 SPAsyncLoading 콜백과 실제 재생 (즉, 트랙이 재생 준비 중이지만 아직 재생되지 않음) 사이의 "데드 스페이스"에 있음을 사용자에게 알릴 수 있어야합니다. 이러한 문제를 우회하거나 해결하는 방법에 대한 모든 권장 사항은 높이 평가되었습니다!

답변

1

먼저 재생 관련 콘텐츠에 SPAsyncLoading을 사용하지 마세요. 그게 목적이 아니며 SPPlaybackManager<SPAsyncLoading>으로 확인하지 않습니다.

isPlaying 속성이 라이브러리가 재생을 위해 트랙을 수락하면 YES으로 반전되며 재생/일시 중지 UI를이 속성으로 설정해야합니다. 대기 시간 및 캐싱 등으로 인해 오디오가 본 것처럼 약간의 시간이 걸릴 수 있습니다. 그러나 trackPosition 속성은 오디오가 스피커로 푸시 된 직접적인 결과로 업데이트됩니다. 타이머를 사용하면 과도 함을 알 수 있습니다. KVO를 사용하여 값을 관찰하면 항상 동기화됩니다.

SPPlaybackManager은 단일 트랙을 재생하도록 설계된 매우 단순한 클래스임을 알고 있어야합니다. 고급 재생을 위해 코드 SPPlaybackManager을보고 SPSessionSPCoreAudioController의 재생 방법을 직접 사용하는 클래스의 기반에 사용하는 것이 좋습니다. 그러면 재생 방식을 훨씬 잘 제어 할 수 있습니다. Objective-C의 유일한 예는 Viva 프로젝트에 있습니다. 구체적으로 VivaPlaybackManager 클래스 over on GitHub입니다. 이 클래스는 셔플, 로컬 파일 재생, Last.fm 등을 지원하므로 역시 복잡 할 수 있지만 단일 샘플을 잃지 않고 멀티 트랙 재생을 훌륭하게 수행합니다.

+0

매우 유용한 답변입니다. 놀랍게도 우리는 재생을 위해'SPAsyncLoading'을 사용하면 안된다는 것을 알았습니다. 대신'preloadTrackForPlayback'을 호출해야합니까? –

+0

수정. SPAsyncLoading은 메타 데이터 전용이며,''프로토콜을 공개적으로 준수하는 클래스에서만 작동합니다. -'SPPlaybackManager'는 이러한 클래스 중 하나가 아닙니다. 'preLoadTrackForPlayback'은 필수는 아니지만'playTrack :'호출과 당신이 여유 시간이 있다면 오디오를 가져 오는 것 사이의 대기 시간을 줄여줍니다 (예를 들어, 이전 트랙이 끝나기 등). 'preloadTrackForPlayback'을 호출하면'playTrack :'이 바로 뒤 따르기 때문에 속도가 향상되지 않습니다. – iKenndac

+0

'playTrack :'을 단독으로 호출하면 "리소스가 아직로드되지 않았습니다."라는 오류가 발생하므로 재생을 시작하기 전에 필요한 데이터를 얻는 방법에 대한 혼란이 있습니다. 내가 놓친 게 있니? 모든 도움에 감사드립니다. –