我有一个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];
效果很好