当设备被蓝牙耳机锁定时,AVAsset无法播放



我有一个iOS6及以上版本的音乐播放器应用程序。我的音乐播放器工作得很好,它可以在线(流媒体)和离线(本地mp3文件)播放音乐。

问题来了,当我连接到我的设备(iPad或iPhone)蓝牙耳机,如果设备是解锁的,它工作正常,但当设备被锁定的音乐继续,直到歌曲结束,然后当它试图播放下一首歌曲,它没有播放。经过一些调试,我意识到问题只是与本地文件,似乎文件不是"可播放",但它真的是因为与设备解锁它工作良好。

我代码:

    NSURL *URL = [[NSURL alloc] initFileURLWithPath:path];
    AVAsset *asset = [AVURLAsset URLAssetWithURL:URL options:nil];
    if(asset.isPlayable) {
        AVPlayerItem *anItem = [AVPlayerItem playerItemWithAsset:asset];
        _player = [AVPlayer playerWithPlayerItem:anItem];
        if(![self isPlaying]) {
            [self play];
        }
    }

if(asset.isPlayable){中的代码永远不会执行。

更新:

我已经改变了我的代码与@MDB983建议,但它不工作无论如何。

        NSURL *URL = [[NSURL alloc] initFileURLWithPath:path];
        AVPlayerItem *anItem = [AVPlayerItem playerItemWithURL:URL];
        if(_player == nil) {
            _player = [AVPlayer playerWithPlayerItem:anItem];
        } else {
            [_player replaceCurrentItemWithPlayerItem:anItem];
        }
        if(![self isPlaying]) {
            [self play];
        }

任何想法?

您是否正在设置'MPNowPlayingInfoCenter's nowPlayingInfo' ?

我在通过AVPlayer播放流媒体文件时发现了同样的问题。一旦文件完成,下一个文件就不会在锁定屏幕显示时播放。解决方案是填充MPNowPlayingInfoCenter的nowPlayingInfo;试着在播放新曲目之前添加这样的东西来设置它;

   UIImage *artworkImage = [UIImage imageWithName:@"artworkImage.jpg"];
   MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc]initWithImage:artworkImage];
   [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"My Song Title", MPMediaItemPropertyTitle,
                                                            @"Artist Name", MPMediaItemPropertyArtist,
                                                            artwork, MPMediaItemPropertyArtwork, 
                                                            1.0f, MPNowPlayingInfoPropertyPlaybackRate, nil];

我遇到的另一个问题,AVPlayer必须在锁定屏幕显示之前实例化,所以你应该修改你的方法,并将AVPlayer创建为一个属性,并在每个歌曲更改上设置一个新的AVPlayerItem,如下所示;

     AVPlayerItem *anItem = [AVPlayerItem playerItemWithAsset:asset];
     [self.player replaceCurrentItemWithPlayerItem:anItem];

我的问题终于解决了。

问题不在于AVPlayer,而在于文件存储。在本地存储我的文件之前,我加密文件,然后在播放它时,我解密它。

问题是我这样保存文件:

BOOL success = [encryptedResult writeToFile:path options:NSDataWritingFileProtectionComplete error:&error];

所以当设备被锁定时,我无法正常读取文件,正如苹果的文档中所说的。

我把所有地方都改成:

BOOL success = [encryptedResult writeToFile:path options:NSDataWritingFileProtectionNone error:&error];

效果很好

最新更新