使用视频/相机时未触发AVAudioSessionInterruptionNotification

时间:2014-06-13 12:29:00

标签: ios iphone objective-c video avaudiosession

我有一些SIP应用程序。在我使用音频之前,只有evrything工作正常,我在必要时收到AVAudioSessionInterruptionNotification

使用视频时出现问题(接收和发送相机输入)。一旦我使用视频会话,即使仅使用后来的音频,也不会再次触发通知。

我该如何解决?我找到了类似的topic,但回答是提示,我不完全明白。此外,我没有摄像头/拍摄设备"和" AVCaptureSession"由于音频和视频流由封闭的第三方库提供,但我的代码必须处理中断。

我是否必须更改某些属性才能始终触发此通知(链接主题提示),或者是否应使用其他通知。
我正在挖掘文档,但我没有找到对我有用的东西。

我尝试使用AVCaptureSession的虚拟对象,但这并没有解决问题。

<小时/> 修改:第三方库遭遇了一些额外的崩溃,暴露了他们使用AVCAptureSession的内容。我已经联系过他们,要求按other question和&#34;乞讨&#34;中所述更改财产usesApplicationAudioSession。他们来解决它。经过长时间的斗争,他们同意了:)。

1 个答案:

答案 0 :(得分:1)

我使用了类别和method swizzling,它就像魅力一样。

#import "AVCaptureSession+MethodSwizzling.h"
#import <objc/runtime.h>


static void MethodSwizzle(Class c, SEL origSEL, SEL overrideSEL) {
  Method origMethod = class_getInstanceMethod(c, origSEL);
  Method overrideMethod = class_getInstanceMethod(c, overrideSEL);
  if(class_addMethod(c, origSEL, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
    class_replaceMethod(c, overrideSEL, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
  } else {
    method_exchangeImplementations(origMethod, overrideMethod);
  }
}

@implementation AVCaptureSession (MethodSwizzling)

- (id)initMethodSwizzling {
  self = [self initMethodSwizzling]; // it is not recursion it is method swizzling
  self.usesApplicationAudioSession = NO;
  return self;
}

+ (void)load {
  if (class_getInstanceMethod(self, @selector(setUsesApplicationAudioSession:))) {
    // Swizzle methods only when it is possible to change usesApplicationAudioSession property.
    MethodSwizzle(self, @selector(init), @selector(initMethodSwizzling));
  }
}

@end