【问题标题】:Initializing AVAudioPlayer with an iPod Song URL Using initWithContentsOfURL使用 initWithContentsOfURL 使用 iPod 歌曲 URL 初始化 AVAudioPlayer
【发布时间】:2012-01-31 05:51:04
【问题描述】:

我知道可以使用 AVPlayer 播放 iPod 歌曲,但我不知道如何使用 initWithContentsOfURL 使用 iPod 歌曲 URL 初始化 AVAudioPlayer。当我尝试时,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。

关于为什么当我使用AVAudioPlayer 时返回NULL,但在我使用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 是一个错误?

有人想吗?

【问题讨论】:

  • 有什么解决办法吗?我在 Swift 中做同样的事情,但没有运气。 .能否请您告诉如何将上述网址设为本地网址
  • @UsamaSadiq 抱歉,但正如您从下面的答案中看到的那样,似乎没有解决方案(至少没有一个对我有用)。

标签: ios background avaudioplayer initwithcontentsofurl


【解决方案1】:

您已经回答了自己的问题,因为据我所知,它是对AVAudioPlayer 很重要的 url 路径,并且它必须是包的本地路径。有一个将AVPlayer 与通知一起使用的示例,搜索AVPlayerDemo 以查找playerItemDidReachEnd,但我无法告诉您它是在后台运行还是在前台运行。

【讨论】:

  • 好的,谢谢。我不知道 url 路径必须是包的本地路径。很高兴知道。不幸的是,当应用程序在后台时,来自 AVPlayer 的通知会被保留,直到它重新进入前台,所以这无济于事
  • 我认为“本地”是指“在捆绑包中”还是“在设备上”是模棱两可的。带有 ipod 库 URL 的 AVAudioPlayer initWithContentsOfURL 在 iOS 6 和 7 中似乎可以正常工作,但我没有看到任何官方文档或对此更改的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
相关资源
最近更新 更多