ios - 通过 Xcode 中的 AVAudioPlayer 从后台任务开始播放音频

标签 ios iphone objective-c ios7

我正在尝试通过随后实例化的 AVAudioPlayer 从后台任务开始播放声音,这就是我得到的。

为了便于阅读,我删除了所有用户选择的值。

- (void)restartHandler {
    bg = 0;
    bg = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:bg];
    }];
    tim = [NSTimer timerWithTimeInterval:.1 target:self selector:@selector(upd) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:tim forMode:NSRunLoopCommonModes];
}

- (void)upd {
    if ([[NSDate date] timeIntervalSinceDate:startDate] >= difference) {
        [self playSoundFile];
        [tim invalidate];
        [[UIApplication sharedApplication] endBackgroundTask:bg];
    }
}

- (void)playSoundFile {

    NSError *sessionError = nil;
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];


    // new player object
    _player = [[AVQueuePlayer alloc] init];
    [_player insertItem:[AVPlayerItem playerItemWithURL:[[NSBundle mainBundle] URLForResource:@"Manamana" withExtension:@"m4a"]] afterItem:nil];

    [_player setVolume:.7];
    [_player play];

    NSLog(@"Testing");
}

说明:bgtimstartDatedifference_player是全局声明的变量。我从用户触发的方法中调用 - (void)restartHandler,并在其中为 - (void)upd 启动一个 10Hz 的重复计时器。当达到预设差异时,将调用 - (void)playSoundFile 并启动播放器。调用方法末尾的测试 NSLog。

现在奇怪的是,如果我在应用程序处于事件状态时调用 - (void)playSoundFile,一切正常,但如果我从后台任务启动它,它就不会播放任何声音。

编辑

所以我尝试在运行时使用不同的线程,看起来,如果 Player 没有在主线程上实例化,同样的问题也会出现。 我还尝试使用 AVPlayerAVAudioPlayer,其中 AVAudioPlayer.playing 属性确实返回 YES,但仍然没有声音正在玩。

最佳答案

根据我在编写播放器应用程序后了解到的情况,当您的应用程序已在后台运行超过 X 秒时,您似乎无法开始播放音频,即使您已正确配置所有内容也是如此。

要修复它,您必须明智地使用后台任务。 最重要的是您必须不要playSoundFile 之后立即调用endBackgroundTask延迟大约 5-10 秒。

以下是我如何为 iOS6 和 iOS7 做到这一点。

1、在plist中添加音频UIBackgroundModes。

2、设置 Audio Session 类别:

3、在主线程中创建一个AVQueuePlayer,并在应用进入后台之前将音频 Assets 入队。

*继续在后台播放(如播放播放列表)*

4、确保AVQueuePlayer中的音频队列永远不会变空,否则您的应用程序将在播放完最后一个 Assets 时暂停。

5,如果 5 秒不足以让您获得下一个 Assets ,您可以使用后台任务来延迟暂停。当 Assets 准备就绪时,您应该调用 endBackgroundTask 10 秒后。

关于ios - 通过 Xcode 中的 AVAudioPlayer 从后台任务开始播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20421698/

相关文章:

ios - 我的开发人员退出,如何编辑并继续开发 ipa 文件(Half Built iOS App)

ios - 从 UITableViewCell 中删除单元格?

objective-c - NSInputStream 获取缓冲区 : length: doesn't work?

iphone - 如何检测前置或后置摄像头是否处于事件状态;以编程方式查找相机分辨率

iOS - 设置自动调整约束前后不同的 bounds.size 值

ios - 在 Swift 中下载数据时如何不阻塞 UI

ios - XCode 构建失败不显示错误

ios - 无法在 Xcode 中检测到 iPhone

iphone - 框架选型如何?

objective-c - 设置 self.title 更改 tabbaritem 标题,我该如何防止呢?