2013-06-15 2 views
1

AVAudioPlayer를 사용하여 오디오 스트리밍을 수행하고 있습니다. 이제 일부 오디오 메타 데이터 (예 : 아티스트, 앨범 이름, 제목 및 아트 워크)를 잠금 화면에 표시하고 싶습니다. 그러나 나는 다음과 같은 문제를 받고 있어요 :AVAudioPlayer, MPNowPlayingInfoCenter 및 오디오 메타 데이터

•를 그때 내가 메타 데이터를 얻을 수 있습니다, URL을 생성하기 위해 문을

NSURL *url = [NSURL URLWithString:urlString]; 

를 사용하는 경우. 그러나 오디오 플레이어가 멈추고 (단지 몇 초간의 오디오 재생) 오디오를 끝내지 못합니다. 나는 URL을 생성하기 위해 문

NSURL *url = [[NSURL alloc] initWithString:urlString]; 

를 사용하는 경우

•은 오디오 플레이어 잘 작동합니다. 그러나 메타 데이터를 얻기 위해 코드는 ([asset availableMetadataFormats]의 NSString * 형식) 루프에 포함되지 않습니다.

아래는 메타 데이터를 얻기 위해 사용하는 코드입니다. 위의 두 NSURL 작성 사이의 차이점을 알고 싶습니다. 또한 오디오 플레이어가 메타 데이터를 가져올 때 제대로 작동 할 수 있도록이 문제를 해결하는 방법. 많은 감사드립니다.

Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter"); 

if (playingInfoCenter) 
{ 
    //NSURL *url = [NSURL URLWithString:urlString]; 
    NSURL *url = [[NSURL alloc] initWithString:urlString]; 

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; 
    NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init]; 

    for (NSString *format in [asset availableMetadataFormats]) 
    { 
     for (AVMetadataItem *metadataItem in [asset metadataForFormat:format]) 
     { 
      if ([metadataItem.commonKey isEqualToString:@"artwork"]) 
      { 
       UIImage* image = [UIImage imageWithData:[(NSDictionary*)metadataItem.value objectForKey:@"data"]]; 
       MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:image]; 
       [songInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork]; 
      } 
      else if ([metadataItem.commonKey isEqualToString:@"title"]) 
      { 
       [songInfo setObject:metadataItem.value forKey:MPMediaItemPropertyTitle]; 
      } 
      else if ([metadataItem.commonKey isEqualToString:@"albumName"]) 
      { 
       [songInfo setObject:metadataItem.value forKey:MPMediaItemPropertyAlbumTitle]; 
      } 
      else if ([metadataItem.commonKey isEqualToString:@"artist"]) 
      { 
       [songInfo setObject:metadataItem.value forKey:MPMediaItemPropertyArtist]; 
      } 
     } 
} 

[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo]; 
} 

답변

0

우선 ARC를 사용하고 있습니까? 그렇지 않다면이 두 변수 사이에 차이가 있습니다. [NSURL URLWithString:urlString]의 경우 자동 수거 객체가 생기고 (더 이상 사용하지 않을 때마다 자동으로 해제되어야 함) [[NSURL alloc] initWithString:urlString]으로 객체의 소유자가됩니다 (보유한 객체). 그렇지 않은 경우 언제든지 release에 전화해야합니다. 필요해. 코드가 for 문을 입력하지 않는 경우

그러나, for (NSString *format in [asset availableMetadataFormats]) 문제, 다음과 같은 세 가지 중 하나를 의미 할 수있다 :

  1. asset는 URL이에 전달 된 경우 발생할 무기 호입니다 [AVURLAsset URLAssetWithURL:url options:nil]은 유효한 파일을 가리 키지 않았습니다.
  2. availableMetadataFormats은 0이 아니며 애셋에는 사용 가능한 메타 데이터 형식이 없습니다.
  3. availableMetadataFormats에 의해 반환 된 배열은 nil이 아니지만 비어 있습니다.

더 이상 알려지지 않아 죄송합니다. 앱 상태에 대한 추가 정보가 필요합니다. 이 제안은 문제를 찾는 데 도움이 될 수 있습니다.