2015-02-03 5 views
0

인터넷에서 매우 작은 (30 초 미만의 오디오) 정적 MP3 파일을 재생하는 매우 간단한 앱을 제작합니다. 파일이 TableView에 나열되고 셀을 클릭하면 View가 열리고 원격 MP3가로드되어 재생됩니다. 오디오는 AVAudioPlayer을 사용하여 재생됩니다. 내가 이 아니며은 라이브 연속 오디오를 스트리밍하려고 시도합니다 (단지 간단한 클립 임). 다음은 내가 시도한 것의 예입니다 - https://s3.amazonaws.com/tevfd-recording/All_Fire_and_EMS_2015-02-0314_38_54_457551.mp3ios - 원격 URL에서 MP3로드 및 재생, 고정 UI

처음에는 [NSData dataWithContentsOfURL:]을 사용하여 MP3 파일의 데이터를 다운로드했습니다. 행을 두드리고 뷰를로드하는 것 사이에 지연이 있다는 사실을 제외하고는 정상적으로 작동했습니다./오디오 재생. 이 접근 방식에 대해 좋아하는 한 가지 점은 사용자가보기를 떠날 때 오디오가 재생되지 않는다는 것입니다 (뒤로 버튼 누름). 이 꽤 잘 작동

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     NSURL *callAudioURL = [NSURL URLWithString:[self.call objectForKey:@"url"]]; 
     NSData *callAudioData = [NSData dataWithContentsOfURL:callAudioURL]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithData: callAudioData error:nil]; 
      self.player = audio; 

      self.slider.minimumValue = 0; 
      self.slider.maximumValue = self.player.duration; 
      [self.player prepareToPlay]; 
      [[self player] play]; 
      self.updateTimer =  [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSeekBar) userInfo:nil repeats:YES]; 
     }); 
    }); 

- - 뷰 사이의 지연 시간을 제거하기위한 시도

NSURL *callAudioURL = [NSURL URLWithString:[self.call objectForKey:@"url"]]; 
NSData *callAudioData = [NSData dataWithContentsOfURL:callAudioURL]; 
AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithData: callAudioData error:nil]; 
self.player = audio; 
// Set slider to change position in audio 
self.slider.minimumValue = 0; 
self.slider.maximumValue = self.player.duration; 
[self.player prepareToPlay]; 
[[self player] play]; 
self.updateTimer =  [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSeekBar) userInfo:nil repeats:YES]; 

, 나는`dispatch_async '에 대한 호출에서 파일의 로딩을 싸서 SEGUE가 완료 신속하고 데이터는 주 스레드에서로드됩니다. 그러나 오디오가 재생되는 동안 사용자가 뒤로 단추를 누르면 계속됩니다.

내 질문 : 나는 이것을 위해 dispatch_async를 올바르게 실행하고 있습니까? 그렇다면 사용자가 뒤로 버튼을 눌렀을 때 플레이어를 죽이면 어떻게해야합니까?

감사합니다.

답변

0

아마도 -[NSData dataWithContentsOfURL:]을 사용하지 말고 NSURLSession을 사용하여 네트워크 작업을 직접 관리해야합니다. -[NSData dataWithContentsOfURL:]은 항상 데이터를 재생하기 전에 100 %의 데이터를로드하므로 동기식이므로 메인 스레드에서이를 호출하면 OS에서 메인 스레드를 멈추게하는 좋은 방법입니다. dispatch_async으로 로딩하면 주 스레드가 멈추지 않지만 데이터를로드하기 전에 100 % 데이터를로드하는 문제는 해결되지 않습니다.

+0

저는 일주일이 채 안되는 iOS 개발자에게 새로운 제품입니다. 몇 가지 코드를 보여 주거나 튜토리얼의 방향으로 나를 가리킬 수 있다면 많은 도움이 될 것입니다. :) – NightMICU

+0

여기 좀보세요 : http://www.raywenderlich.com/51127/nsurlsession-tutorial – ipmcc

+0

LOL 방금 찾았습니다. 질문하기 전에 Google을 사용해 보았을 것입니다.) 잠시 쉬고 그냥 조금. 감사! – NightMICU