Ios 在录制应用程序中执行振动

Ios 在录制应用程序中执行振动,ios,avfoundation,avaudiosession,iphone-vibrate,Ios,Avfoundation,Avaudiosession,Iphone Vibrate,我正在尝试在一个类似Snapchat的应用程序中执行振动,该应用程序使用音频输出和输入,并支持来自其他应用程序的音频混合,但这似乎是一个我最初认为更难的任务。重要的是要知道,我并没有试图在播放或录制过程中振动。通过阅读我能找到的所有关于该主题的文档,我了解到: 为了支持播放和录制(输出和输入),我需要使用AVAudioSessionCategoryPlayAndRecord 任何录音类别(包括AvaudioSessionCategoryPlay和Record)都不支持通过AudioServic

我正在尝试在一个类似Snapchat的应用程序中执行振动,该应用程序使用音频输出和输入,并支持来自其他应用程序的音频混合,但这似乎是一个我最初认为更难的任务。重要的是要知道,我并没有试图在播放或录制过程中振动。通过阅读我能找到的所有关于该主题的文档,我了解到:

  • 为了支持播放和录制(输出和输入),我需要使用
    AVAudioSessionCategoryPlayAndRecord
  • 任何录音类别(包括
    AvaudioSessionCategoryPlay和Record)都不支持通过
    AudioServicesPlaySystemSound(kSystemSoundID\u vibrate)
    使手机振动
  • 通过添加选项
    avaudiosessioncategoryooptionmixwithothers
    ,可以启用其他应用程序播放音频
因此,我在我的应用程序代理中执行此操作:

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上设置了
    UseApplicationAudioSession=YES
    ,这可能仍然是一个有效的解决方案,但我还没有让它工作

资料来源:


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

UIImpactFeedbackGenerator

ui选择反馈生成器

UINotificationFeedbackGenerator


因此,我最近一直在尝试在我的应用程序中播放一个简单的哔哔声,其中一种方法是:

AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID);
这是一个从
/system/Library/Audio/UISounds/
播放系统声音的函数,所有iOS版本都支持该函数

声音1350等于
铃声被改变
(振动)。所以

…振动约0.5秒

如果您对更多声音感兴趣,这里有一个链接,指向所有可播放的声音以及它们添加到的iOS版本:

作为参考,我不是使用
AVCaptureSession
而是使用
AVAudioEngine
来录制一些东西,就我的情况而言,我将其精确定位为必须暂停输入,以便在录制会话期间使用
AudioServicesPlaySystemSound
正确播放振动

就我而言,我做了类似的事情

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

我不确定它是否也适用于为
AVCaptureSession
执行类似操作(即
stopRunning()
startRunning()
),但请将此留在这里,以防有人想尝试一下。

谢谢,但我需要支持较旧的设备。我尝试了此解决方案,但应用程序录制时似乎出现了问题。反馈发生器不起作用Hello@PatrikVaber您找到录音振动的解决方案了吗?尝试振动时是否有
AVAudioRecorder
实例录音?使用AudioServicesPlaySystemSound执行振动是我遇到的问题。使用1350而不是kSystemSoundID_振动(这只是4095的别名)没有什么区别。
audioEngine?.pause()
AudioServicesPlaySystemSound(1519)
do {
  try audioEngine.start()
} catch let error {
  print("An error occurred starting audio engine. \(error.localizedDescription)")
}