0

我正在使用AVAudioPlayerNSFileHandle做音频流。基本思想是我将流音频数据保存到带有文件系统的设备中,然后用于AVAudioPlayer播放刚刚保存的文件。 AVAudioPlayer即使正在进行流式传输,仍然可以播放该文件。

我有一个UIButton开始流式传输/下载。当下载的数据累积到特定数量的 Bytes 时,将自动播放(触发AVAudioPlayer“播放”方法)。AVAudioPlayer我的问题是:我点击按钮开始流式传输/下载,然后很快按下 iPhone 的主页按钮,让我的应用程序进入后台。下载继续在后台运行,但“播放”方法AVAudioPlayer返回“否”,这意味着“播放”方法不播放音频。

我在音频播放器的 init 方法中添加了AVAudioSession相关代码:

- (id) initWithURL:(NSString *) downloadedMusicURL
{
    if ((self = [super init]))
    {       
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

        CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)downloadedMusicURL, kCFURLPOSIXPathStyle, FALSE);

        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:CFBridgingRelease(url) error:nil];

        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setActive:YES error:nil];
        [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    }

    return self;
}

同样在 info.plist 中,我为键“必需的背景模式”添加了一个项目“应用程序播放音频”。但是,“播放”仍然没有在后台正确调用。我还错过了什么?提前非常感谢。

4

4 回答 4

2

您的应用无法开始在后台播放音频。这是有道理的。想想如果用户没有积极使用的应用程序突然开始发出声音,设备会是什么样子!请记住,对于用户来说,将应用程序发送到后台是天真的等价于退出该应用程序。你的应用不能像僵尸一样从死里复活并开始制造噪音!

背景音频设置允许您的应用程序在前台生成音频然后在进入后台时继续这样做。然后它可以继续负责音频(如果它接收到远程事件),直到其他一些应用程序发出声音;之后,您的应用程序将再次停止运行,直到它被带到前台并发出声音。

因此,如果你想让它工作,你需要在你的应用程序进入后台之前开始播放一些声音。

于 2013-05-15T14:56:33.523 回答
1
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];

/* 在 info.Plist 文件中所需的背景模式:App PLAYS Audio */

于 2013-09-18T10:02:08.627 回答
0

面临这个问题。让我建议您将 AVAudioSessionCategoryOptionMixWithOthers 与 -setCategory:withOptions:error: 一起使用。此外,在设置类别之后激活会话可能是有意义的,而不是之前。

于 2013-05-28T07:31:27.460 回答
0

请使用此代码- (void)applicationDidEnterBackground:(UIApplication *)application

UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask = 0;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
[app endBackgroundTask:bgTask]; 
}];
AudioSessionSetActive(false);

并在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

AudioSessionInitialize (NULL,NULL,NULL,NULL);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,sizeof (sessionCategory),&sessionCategory);
AudioSessionSetActive(true);

希望这可以帮助。

于 2013-05-15T11:57:19.160 回答