AVCaptureSession和后台音频iOS 7

15

每当我使用麦克风作为输入开始运行AVCaptureSession时,它会取消当前正在播放的任何背景音乐(例如iPod音乐)。如果我注释掉添加音频输入的那一行,背景音频就会继续播放。

有人知道如何在录制视频片段的同时继续播放背景音频吗?还有一个错误,当您尝试录制视频并且当前正在播放音乐时会出现。

我尝试过这样做:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
[[AVAudioSession sharedInstance] setActive: YES error: nil];

但是'AudioSessionSetProperty'已经被弃用:自iOS 7.0开始首次弃用。

所以我尝试像这样做:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *setCategoryError = nil; 
[audioSession setCategory:AVAudioSessionCategoryPlayback
              withOptions:AVAudioSessionCategoryOptionMixWithOthers
                    error:&setCategoryError];
[audioSession setActive:YES error:nil];

但最终它没能成功。感谢您的帮助!


http://stackoverflow.com/questions/19069277/background-and-foreground-apps-using-audio - user523234
感谢您的回答,但是'AudioSessionSetProperty'已经被弃用:从iOS 7.0版本开始被标记为废弃。@user523234 - Maxim Irbe
1
我希望我的回答能够帮到你。我花了一天以上的时间来找出解决方案。 - Gabriel.Massana
2个回答

31

在您的 AppDelegate 中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Stop app pausing other sound.
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord
                                     withOptions:AVAudioSessionCategoryOptionDuckOthers | AVAudioSessionCategoryOptionDefaultToSpeaker
                                           error:nil];
}

您分配 AVCaptureSession 的位置:

AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.automaticallyConfiguresApplicationAudioSession = NO;

这段代码将允许您播放背景音乐并通过麦克风运行AVCaptureSession

SWIFT更新:

AppDelegate

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    //Stop app pausing other sound.
    do{
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, 
                                            withOptions: [.DuckOthers, .DefaultToSpeaker])
    }
    catch {

    }

    return true
}

在你分配 AVCaptureSession 的位置:

let session = AVCaptureSession()
session.automaticallyConfiguresApplicationAudioSession = false

3
成功了。我花了将近3天的时间。非常感谢你,Gabriel。 - Shreya
1
Gabriel,我提出了一个悬赏问题,并在寻找答案的漫长日子后,在你的回答中找到了它。如果你愿意的话,我很乐意把悬赏给你。 - Lehman2020
https://dev59.com/qI3da4cB1Zd3GeqP5NIX - Lehman2020
1
@Gabriel.Massana - 这个很好用,但是背景音乐有明显的初始变暗...你有什么办法可以避免这种情况吗?谢谢! - trdavidson
1
@Gabriel.Massana,真遗憾啊 - 感谢您的快速回复!如果我最终解决了这个问题,我会再向您汇报的。 - trdavidson
显示剩余4条评论

19
你可以使用AVAudioSessionCategoryOptionMixWithOthers选项。例如,
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];

接下来,您可以同时使用AVAudioPlayerAVCaptureSession

然而,上述代码会导致非常低的音量。 如果您想要正常音量,请按照以下方式使用AVAudioSessionCategoryOptionDefaultToSpeakerAVAudioSessionCategoryOptionMixWithOthers

[session setCategory:AVAudioSessionCategoryPlayAndRecord  withOptions:AVAudioSessionCategoryOptionMixWithOthers|AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];

这很好。


2
这对我来说进展不顺利。当我调用最后一行时,背景音频停止播放。 - AndroC
你的iOS版本是什么?我还没有检查过iOS8。苹果可能会更改规格。 - KNaito
3
我发现将其放置在“AppDelegate didFinishLaunching”中时可以工作。但在这种情况下,应用程序启动时会出现明显的背景音频暂停。如果我想从“Ambient”开始应用程序,然后稍后切换到“PlayAndRecord”,首先必须调用“setActive:NO withOptions:NotifyOnDeactivation”,在设置“PlayAndRecord”类别后,我必须重新激活“setActive:YES”。所有这些切换导致背景音频短暂停顿并且我的“AVCaptureSession”中出现了视觉故障。 - AndroC
1
感谢ancajic提供宝贵的报告。 - KNaito
ancajic,你有没有解决这个故障的办法?我正在使用PlayAndRecordsetActive:YES,遇到了同样的故障。如果你找到了任何解决方案,请告诉我。 - Surjeet Singh
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接