【问题标题】:AVCaptureSession and background audio iOS 7AVCaptureSession 和背景音频 iOS 7
【发布时间】:2014-03-19 03:39:58
【问题描述】:

每当我启动一个以麦克风作为输入运行的 AVCaptureSession 时,它都会取消当前正在运行的任何背景音乐(例如 iPod 音乐)。如果我注释掉添加音频输入的行,背景音频会继续。

有谁知道用麦克风录制视频剪辑同时继续播放背景音频的方法?当您尝试录制视频并且当前正在播放音乐时,也会出现错误。

A 试图这样做:

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

但是 'AudioSessionSetProperty' is deprecated: first deprecated in iOS 7.0

所以我尝试这样做:

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

但最后还是不行。感谢您的帮助!

【问题讨论】:

  • 感谢您的回答,但是:'AudioSessionSetProperty' 已被弃用:首先在 iOS 7.0 中弃用 @user523234
  • 希望我的回答能有所帮助。我花了一天多的时间来找出解决方案。

标签: ios objective-c avcapturesession avaudiosession avcapturedevice


【解决方案1】:

在您的 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

快速更新:

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 天的时间。感谢加布里埃尔。
  • Gabriel,我从这个确切的问题开始赏金,经过多天的搜索,我找到了你的答案。如果你愿意,我很乐意给你赏金。
  • @Gabriel.Massana - 这很好,但背景音乐的初始变暗很明显......你知道如何绕过这个吗?谢谢!
  • @Gabriel.Massana 真是个可耻的人 - 感谢您的快速回复!如果我最终解决它,我会报告。
【解决方案2】:

您可以使用AVAudioSessionCategoryOptionMixWithOthers。 例如,

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];

之后,您可以同时使用AVAudioPlayerAVCaptureSession

但是,上面的代码导致音量非常低。 如果您想要正常音量,请使用AVAudioSessionCategoryOptionDefaultToSpeakerAVAudioSessionCategoryOptionMixWithOthers,如下所示,

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

一切顺利。

【讨论】:

  • 这对我来说并不顺利。当我调用最后一行时,背景音频停止播放。
  • 您的 iOS 版本是多少?我还没有检查iOS8。 Apple 可能会更改规范。
  • 我发现它在放入AppDelegate didFinishLaunching 时确实有效。但是,在这种情况下,应用程序启动时背景音频会出现明显的停顿。如果我想在Ambient 中启动应用程序,然后切换到PlayAndRecord,首先我必须调用setActive:NO withOptions:NotifyOnDeactivation,在设置PlayAndRecord 类别后我必须重新激活setActive:YES。所有这些切换都会导致我的AVCaptureSession 中的背景音频和视觉故障短暂暂停。
  • 感谢 ancajic 的宝贵报告。
  • 我已经在我的视图控制器viewDidLoad中添加了上面两行代码。录制(通过耳机)后,我的音乐文件输出将是通过麦克风录制的声音 + 通过扬声器播放的背景音乐的组合。但我的问题是通过扬声器播放的背景音乐的声音在最终输出的音乐中非常低。
猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多