5

AVPlayerを使用してiPhoneミュージックライブラリから曲を再生しようとしています。すべてを再生する準備ができているように見えますが、プレーヤーは単に音を出さないでしょう。私はしばらくこれに苦労してきました、どんな助けでも大歓迎です!

注: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");
}];

出力は「Readytoplay」で、playメソッドを呼び出した後のAVPlayerの「rate」プロパティは1.0です。MPMediaItemが存在し、valueForPropertyメソッドを使用して、正しいタイトルやアーティストなどを取得できます。プレーヤーから音が出ない理由はありますか?

4

2 に答える 2

12

うまくいったものを見つけました:

  1. AVPlayerをプロパティにしました(チップメガーに感謝します!)
  2. initWithAssetメソッドを使用する前に、AVPlayerがnilであることを確認しました。

    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];
    
    }];
    

これが誰かを助けることを願っています!

于 2012-06-22T21:44:18.377 に答える
1

もう1つの理由は、AVAudioSessionの構成です。私のために働いた。

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
  [[AVAudioSession sharedInstance] setActive: YES error: nil];
于 2013-11-12T13:47:54.873 に答える