11

我正在尝试在类似于 Snapchat 的应用程序中执行振动,该应用程序同时使用音频输出和输入以及支持来自其他应用程序的音频混合,但这似乎是我最初认为的一项更艰巨的任务。重要的是要知道我不会在播放或录制期间尝试振动。通过阅读我能找到的关于该主题的所有文档,这就是我所理解的:

  • 为了同时支持播放和录制(输出和输入),我需要使用AVAudioSessionCategoryPlayAndRecord
  • AudioServicesPlaySystemSound (kSystemSoundID_Vibrate)任何录音类别都不支持让手机振动,包括AVAudioSessionCategoryPlayAndRecord.
  • 可以通过添加选项来启用其他应用程序播放音频AVAudioSessionCategoryOptionMixWithOthers

因此,我在我的应用程序委托中执行此操作:

NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers error:&error];

我尝试过但失败的振动的可能解决方案是:

  • 在振动之前停用共享AVAudioSession,然后立即将其激活。

    [[AVAudioSession sharedInstance] setActive:NO error:nil];         
    AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    

    这成功地执行了振动,但是之后,当我尝试录制电影时,音频被闪避(或其他原因导致它非常安静)。它还给我一个错误,说我不允许在不先删除其 I/O 设备的情况下停用会话。

  • 在振动之前更改类别,然后将其更改回来。

    [[AVAudioSession sharedInstance] setActive:NO error:nil];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    
    [[AVAudioSession sharedInstance] setActive:NO error:nil];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers error:nil];
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    

    这个解决方案时不时出现,但似乎对我不起作用。即使类别似乎已设置,也不会发生振动。如果我在我的 AVCaptureSession 上设置,这可能仍然是一个有效的解决方案usesApplicationAudioSession = YES,但我还没有让它工作。

资料来源:

4

3 回答 3

3

所以,我最近一直在尝试在我的应用程序中播放一个简单的哔声,我偶然发现的一种方法是:

AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID);

这是一个播放系统声音的功能,/System/Library/Audio/UISounds/ 它在所有 iOS 版本上都支持。

声音1350等于RingerVibeChanged(振动)。所以..

AudioServicesPlaySystemSound(1350);

...振动约 0.5 秒。

如果您对更多声音感兴趣,这里是所有可播放声音的链接以及它们已添加的 iOS 版本:http: //iphonedevwiki.net/index.php/AudioServices

于 2016-10-01T19:19:55.373 回答
1

作为参考,我不是在使用AVCaptureSessionanAVAudioEngine来录制某些东西,对于我的情况,我将其归结为必须暂停输入才能AudioServicesPlaySystemSound在录制会话期间正确播放振动。

所以就我而言,我做了这样的事情

audioEngine?.pause()
AudioServicesPlaySystemSound(1519)
do {
  try audioEngine.start()
} catch let error {
  print("An error occurred starting audio engine. \(error.localizedDescription)")
}

我不确定它是否也适用于AVCaptureSession(即stopRunning()startRunning())做类似的事情,但把它留在这里以防有人想试一试。

于 2018-07-20T07:53:24.723 回答
1

您没有说您支持的设备要求是什么,但是对于较新的设备,您可以使用新的 Taptic Engine API,例如:

UIImpactFeedbackGenerator

UISelectionFeedbackGenerator

UINotificationFeedbackGenerator

https://developer.apple.com/reference/uikit/uifeedbackgenerator#2555399

于 2016-09-25T01:21:31.013 回答