Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone AVPlayer未从音乐库播放_Iphone_Objective C_Avplayer - Fatal编程技术网

Iphone AVPlayer未从音乐库播放

Iphone AVPlayer未从音乐库播放,iphone,objective-c,avplayer,Iphone,Objective C,Avplayer,我正在尝试使用AVPlayer播放iPhone音乐库中的一首歌曲。一切似乎都准备好了,但玩家根本不会发出任何声音。我已经为此挣扎了一段时间,如果有任何帮助,我将不胜感激 注意:我知道我可以使用AVAudioPlayer,但我想直接从我的音乐库中读取文件,据我所知,AVAudioPlayer不支持这一点(我必须先导出歌曲,占用更多时间)。我不能使用MPMusicLayerController,因为最终目标是将歌曲转换为NSData并在其他设备上播放 最重要的是,我想知道为什么这段代码不起作用: N

我正在尝试使用AVPlayer播放iPhone音乐库中的一首歌曲。一切似乎都准备好了,但玩家根本不会发出任何声音。我已经为此挣扎了一段时间,如果有任何帮助,我将不胜感激

注意:我知道我可以使用AVAudioPlayer,但我想直接从我的音乐库中读取文件,据我所知,AVAudioPlayer不支持这一点(我必须先导出歌曲,占用更多时间)。我不能使用MPMusicLayerController,因为最终目标是将歌曲转换为NSData并在其他设备上播放

最重要的是,我想知道为什么这段代码不起作用:

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

调用play方法后,输出为“Ready to play”,AVPlayer的“rate”属性为1.0。MPMediaItem存在,我可以使用valueForProperty方法获得正确的标题、艺术家等。您知道为什么播放机没有声音吗?

找到了一些有效的方法:

  • 我把AVPlayer变成了一个财产(感谢meggar给我的小费!)
  • 在使用initWithAsset方法之前,我确保AVPlayer为零

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

  • 希望这能帮到别人

    另一个原因是配置音频会话。为我工作

     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
      [[AVAudioSession sharedInstance] setActive: YES error: nil];
    

    您是否尝试在块之外声明AVPlayer和AVPlayerItem,比如在
    NSArray*keyArray
    之后?我尝试了。在外部声明和初始化它们并没有什么区别。显然,禁止在处理程序外部声明和初始化它们。谢谢你的主意!谢谢。真正地谢谢很多