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

时间:2014-05-05 12:44:11

标签: ios iphone bluetooth

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您是否正在设置MPNowPlayingInfoCenter现在正在发布信息' ?

通过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];

答案 1 :(得分:0)

我终于解决了我的问题。

关键在于AVPlayer,它是文件存储。在本地存储我的文件之前,我加密文件然后播放它我解密它。

问题是我正在保存这样的文件:

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

因此,当设备被锁定时,我无法正确读取文件,如Apple's documentation中所述。

我到处改变了:

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

它就像一个魅力。