使用AVAudioplayer在后台播放音乐
即使应用程序在后台运行,我也想播放音乐。 我检查了所有的stackoverflow链接,但没有一个工作。 请帮助需要今天做。
我曾经使用下面的代码:
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Day At The Beach" ofType: @"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; NSError *error; playerTemp = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error]; playerTemp.numberOfLoops = 0; AudioSessionSetActive(true); [playerTemp play];
我通过引用iOS应用程序后台任务解决了这个问题
并在我们的应用程序的.plist
文件中进行一些更改..
更新
把这个代码写在你的控制器的视图中,像这样做加载方法
- (void)viewDidLoad { NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"in-the-storm" ofType:@"mp3"]]; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [audioPlayer play]; [super viewDidLoad]; }
我只是想给Mehul的回答添加一个注释。 这一行:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
其实很重要。 我使用其他教程来启动并运行AVAudioPlayer。 一切正常,除了我的audio不会开始,如果应用程序在后台。 为了澄清,我的audio是好的,如果它已经在播放时,应用程序进入背景…但它不会开始,如果应用程序已经在后台。
添加上面的代码行使它即使应用程序在后台我的audio将开始。
你需要在Info.plist中将'audio'设置为你的一个UIBackgroundMode。 苹果有关于这个问题的文档 。
甚至可以使用MPMoviePlayerController播放独奏audio电影。 如果您喜欢,请阅读详细的Apple Library技术问答:
iOS开发人员库技术问答QA1668
步骤1
在info.plist中进行以下更改
-
应用程序不会在后台运行:NO
-
所需的背景模式
item0 :App plays audio or streams audio/video using AirPlay
第2步不要忘记在MainViewController.h
文件中添加以下内容
-
#import <'AVFoundation/AVAudioPlayer.h>
-
@interface MainViewController:<'AVAudioPlayerDelegate>
-
AVAudioPlayer *H_audio_player;
步骤3在MainViewController
类的播放操作中添加以下代码。
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d-%d",C_CID, C_SID] ofType:@"mp3"]; NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; H_audio_player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil]; H_audio_player.delegate = self; H_audio_player.numberOfLoops = -1;
写这行以plist为背景运行…
<key>UIBackgroundModes</key> <array> <string>audio</string> </array>
写这个代码你想使用的地方
AVAudioPlayer* audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.urlForConevW error:&error]; audioPlayer.delegate = self; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; audioPlayer.numberOfLoops = 1; [audioPlayer play];
在这里也很重要,如果你使用MPMusicPlayerController
:你必须使用:
[MPMusicPlayerController iPodMusicPlayer]
并不是
[MPMusicPlayerController applicationMusicPlayer]
另外,如果您不希望自己的应用stop music
应用启动时播放的stop music
,请看这里: AVAudioPlayerclosuresiPod – 如何解决?
我使用下面的代码。 它为我工作,并调用button点击audio播放器实例方法。
NSError *error; NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]]; self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error]; [[AVAudioSession sharedInstance] setActive:YES error: &error]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self.player prepareToPlay];
从所有的答案是缺less这个代码来控制玩家当用户醒来的设备:
- (BOOL)canBecomeFirstResponder { return YES; } - (void)remoteControlReceivedWithEvent:(UIEvent *)event { switch (event.subtype) { case UIEventSubtypeRemoteControlPlay: [_audioPlayer play]; break; case UIEventSubtypeRemoteControlPause: [_audioPlayer pause]; break; default: break; } }
你有所有这些选项:
UIEventSubtypeRemoteControlPlay = 100, UIEventSubtypeRemoteControlPause = 101, UIEventSubtypeRemoteControlStop = 102, UIEventSubtypeRemoteControlTogglePlayPause = 103, UIEventSubtypeRemoteControlNextTrack = 104, UIEventSubtypeRemoteControlPreviousTrack = 105, UIEventSubtypeRemoteControlBeginSeekingBackward = 106, UIEventSubtypeRemoteControlEndSeekingBackward = 107, UIEventSubtypeRemoteControlBeginSeekingForward = 108, UIEventSubtypeRemoteControlEndSeekingForward = 109,
如果即使将audio设置为plist中的一个UIBackgroundModes
,audio在进入后台时UIBackgroundModes
停止,请尝试setting
application's audio session
为media playback
。
以下是相关的参考资料: https : //developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html
这是关于代码的样子:
NSError *activationError = nil; [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; NSError*setCategoryError = nil; [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
在后台播放audio
第1步:只需在你的info.plist中添加一个数组
第2步 :
- (void)applicationDidEnterBackground:(UIApplication *)application { __block UIBackgroundTaskIdentifier task = 0; task=[application beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]); [application endBackgroundTask:task]; task=UIBackgroundTaskInvalid; }]; }
第三步:
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"iNamokar" ofType:@"mp3"]; NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath]; AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [player prepareToPlay]; [self.player play];
从Apple的示例代码:混音器(MixerHost)
// If using a nonmixable audio session category, as this app does, you must activate reception of // remote-control events to allow reactivation of the audio session when running in the background. // Also, to receive remote-control events, the app must be eligible to become the first responder. - (void) viewDidAppear: (BOOL) animated { [super viewDidAppear: animated]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; }
我认为以下情况不需要遥控事件:
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(value), &value);