AVPlayer 未从音乐库播放

Posted

技术标签:

【中文标题】AVPlayer 未从音乐库播放【英文标题】:AVPlayer not playing from music library 【发布时间】:2012-06-19 14:46:45 【问题描述】:

我正在尝试使用 AVPlayer 播放我的 iPhone 音乐库中的歌曲。一切似乎都可以播放了,但播放器根本不会发出任何声音。我已经为此苦苦挣扎了一段时间,任何帮助将不胜感激!

注意:我意识到我可以使用 AVAudioPlayer,但我想直接从我的音乐库中读取文件,据我了解,AVAudioPlayer 不支持(我必须先导出歌曲,占用更多时间)。我不能使用 MPMusicPlayerController,因为最终目标是将歌曲转换为 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");
];

输出是“Ready to play”,我调用play方法后AVPlayer的“rate”属性是1.0。 MPMediaItem 存在,我可以使用 valueForProperty 方法来获取正确的标题、艺术家等。任何想法为什么播放器没有声音?

【问题讨论】:

您是否尝试在块之外声明 AVPlayer 和 AVPlayerItem,就像在 NSArray *keyArray 之后一样? 我做到了。在外面声明和初始化它们并没有什么不同。显然禁止在外部声明它们并在处理程序中初始化它们。不过感谢您的想法! 【参考方案1】:

找到了一些有用的东西:

    我将 AVPlayer 设为了一个属性(感谢 meggar 的提示!)

    在使用 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];
    
    ];
    

希望这对某人有所帮助!

【讨论】:

非常感谢。真的。谢谢。很多。【参考方案2】:

另一个原因是配置 AVAudiosession。为我工作。

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

【讨论】:

以上是关于AVPlayer 未从音乐库播放的主要内容,如果未能解决你的问题,请参考以下文章

iOS音频篇:使用AVPlayer播放网络音乐

iOS音频篇:使用AVPlayer播放网络音乐

如何在其他视图中使用 Swift 中的 AVPlayer 暂停和播放音乐

AVPlayer 音乐播放后台播放,以及锁屏主题设置

使用 AVPlayer 时防止背景音频静音

iOS音频篇:AVPlayer的缓存实现