2012-06-19 23 views
5

AVPlayerを使用して自分のiPhoneミュージックライブラリから曲を再生しようとしています。すべてが再生準備が整っているように見えますが、プレイヤーは単に音を出すことはありません。私はしばらくの間これに苦労してきた、どんな助けも大いに評価されるだろう!AVPlayerが音楽ライブラリから再生しない

注:私はAVAudioPlayerを使用することができましたが、私は自分の音楽ライブラリからファイルを読みたいと思います。私の理解では、AVAudioPlayerはそれをサポートしていません(まず、より多くの時間)。最終的な目標は、曲をNSDataに変換して別のデバイスで再生することなので、MPMusicPlayerControllerを使用することはできません。

NSArray *itemsFromQuery = [[MPMediaQuery songsQuery] items]; 
MPMediaItem *song = [itemsFromQuery objectAtIndex:29]; 
NSURL *songURL = [song valueForProperty:MPMediaItemPropertyAssetURL]; 
AVURLAsset *urlAsset = [[AVURLAsset alloc] initWithURL:songURL options:nil]; 

NSArray *keyArray = [[NSArray alloc] initWithObjects:@"tracks", nil]; 

[urlAsset loadValuesAsynchronouslyForKeys:keyArray completionHandler:^{ 

    AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:urlAsset]; 

    AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 

    while (true) { 
     if (player.status == AVPlayerStatusReadyToPlay && playerItem.status == AVPlayerItemStatusReadyToPlay) { 
      break; 
     } 
    } 

    if (player.status == AVPlayerStatusReadyToPlay && playerItem.status == AVPlayerItemStatusReadyToPlay) { 
     NSLog(@"Ready to play"); 
     [player play]; 
    } 
    else 
     NSLog(@"Not ready to play"); 
}]; 

出力は「プレーする準備ができました」であり、「率」AVPlayerのプロパティは、私が呼び出した後1.0:何より

、私はこのコードが再生されていない理由を知りたいです再生方法MPMediaItemが存在し、valueForPropertyメソッドを使用して正しいタイトル、アーティストなどを取得することができます。プレイヤーからサウンドが聞こえない理由は何ですか?働いていた何かが見つかり

+1

「NSArray * keyArray」の直後のように、AVPlayerとAVPlayerItemをブロック外で宣言しようとしましたか? – meggar

+0

しました。それらを宣言して外部に初期化しても違いはありません。それらを外部に宣言してハンドラ内で初期化することは、明らかに禁止されています。しかし、アイデアをありがとう! – JohnG

答えて

12

  1. を私はAVPlayerに(先端meggarに感謝を!)プロパティを作っ
  2. 私はAVPlayerがinitWithAssetメソッドを使用する前にゼロだったことを確認しました。

    NSArray *itemsFromQuery = [[MPMediaQuery songsQuery] items]; 
    MPMediaItem *song = [itemsFromQuery objectAtIndex:0]; 
    NSURL *songURL = [song valueForProperty:MPMediaItemPropertyAssetURL]; 
    AVURLAsset *urlAsset = [[AVURLAsset alloc] initWithURL:songURL options:nil]; 
    
    NSArray *keyArray = [[NSArray alloc] initWithObjects:@"tracks", nil]; 
    
    [urlAsset loadValuesAsynchronouslyForKeys:keyArray completionHandler:^{ 
    
        AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:urlAsset]; 
    
        player = nil; 
        player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 
    
        while (true) { 
         if (player.status == AVPlayerStatusReadyToPlay && playerItem.status == AVPlayerItemStatusReadyToPlay) 
          break; 
        } 
    
        [player play]; 
    
    }]; 
    

これが誰かを役に立てば幸い!

+1

ありがとう。本当に。ありがとう。たくさん。 – duci9y

1

もう一つの理由は、AVAudioSessionの設定です。私のために働いた。

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
    [[AVAudioSession sharedInstance] setActive: YES error: nil]; 
関連する問題