2

我知道可以使用 AVPlayer 播放 iPod 歌曲,但我无法弄清楚如何AVAudioPlayer使用initWithContentsOfURL. 当我尝试AVAudioPlayer时,初始化时返回 NULL。

我需要使用AVAudioPlayer,因为当我的应用程序在后台运行时,我需要使用它的委托方法audioPlayerDidFinishPlaying进行进一步处理(即,如果应用程序在后台运行,则调用AVAudioPlayer委托方法audioPlayerDidFinishPlaying。但是AVPlayer不提供委托方法,所以你只能使用不在后台运行的通知)。

以下代码用于使用 AVPlayer 播放 iPod 歌曲。

- (void)viewDidLoad {

    [super viewDidLoad];
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    NSError *error = nil;

    [session setActive:YES error:&error];
    MPMediaQuery *query = [MPMediaQuery songsQuery];
    NSArray *collection = [query items];
    MPMediaItem *item = [collection objectAtIndex:0];
    NSLog(@"%@",[item valueForProperty:MPMediaItemPropertyTitle]);
    NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
    AVPlayer *player = [[AVPlayer alloc]initWithURL:url];   // <-- Line to Replace
    [player play];
}

这很好用。但是,如果我将倒数第二行替换为以下内容:

    AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];

调用initWithContentsOfURL返回 NULL。

关于为什么在我使用时返回 NULL AVAudioPlayer,但在我使用时返回初始化播放器的任何想法AVPlayer

根据技术问答http://developer.apple.com/library/ios/#qa/qa1634/_index.html,“与 initWithContentsOfURL: 一起使用的 URL 必须是文件 URL (file://)。也就是说,本地路径。”

当我在我的 iPod 库中获取歌曲的 url 时,路径是:

ipod-library://item/item.mp3?id=-4017276016911605928

你会说我的 iPod 库的这个路径不被认为是“本地路径”还是你认为它是一个initWithContentsOfURL返回 NULL 的错误?

有人想吗?

4

1 回答 1

1

您已经回答了自己的问题,因为据我所知,它是重要的 url 路径AVAudioPlayer,并且它必须是包的本地路径。有一个使用AVPlayer通知的例子,搜索AVPlayerDemoplayerItemDidReachEnd我不能告诉你它是在后台运行还是在前台运行。

于 2012-02-22T16:00:39.413 回答