swift - Swift-示例-如何在使用AVAudioRecorder录制之前和之后播放提示音?

标签 swift session audio record playback

我想使用Swift在iOS中实现类似Whatsapp的录制按钮,当用户按下按钮时,蜂鸣声表示开始,此后录制开始,当用户释放按钮时,录制停止,而另一声蜂鸣声表示录制完成。

我尝试使用以下代码实现此功能:

func startRecording(sender: UIDataButton?, callData: NSDictionary?) -> Bool {
    do {
        if (self.audioRecorder == nil) {

            AudioServicesPlayAlertSound(1110) // JBL_Begin

            self.audioSession = AVAudioSession.sharedInstance()
            try self.audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: .MixWithOthers)
            try self.audioSession.setMode(AVAudioSessionModeVoiceChat)
            try self.audioSession.setActive(true)

            if (sender != nil) {
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    sender!.setTitle("Recording...", forState: .Normal)
                })
            }

            try self.audioRecorder = AVDataAudioRecorder(URL: self.fileURL("\(CurrentTimestamp)_aud.mp4")!,
                settings: self.recordSettings)

            if (sender != nil) {
                self.audioRecorder.setRecorderSender(sender!)
            }
            if (callData != nil) {
                self.audioRecorder.setRecorderData(callData!)
            }

            self.audioRecorder.delegate = self

            if (self.audioRecorder.prepareToRecord()) {
                if (self.audioRecorder.record()) {
                    NSLog("audioRecorder started recording")
                    return true
                } else {
                    self.audioRecorder = nil
                    NSLog("audioRecorder not started")
                    return false
                }
            } else {
                NSLog("audioRecorder failed to prepare")
                return false
            }

        }
    } catch let error as NSError {
        print("Error \(error.debugDescription)")
        if (self.audioRecorder != nil) {
            self.audioRecorder.stop()
            self.audioRecorder = nil
        }
        return false
    }

    return false
}

func finishRecording(sender: UIDataButton?) -> AVDataAudioRecorder? {

    var recorder: AVDataAudioRecorder? = nil

    if self.audioRecorder != nil {

        self.audioRecorder.stop()
        NSLog("audioRecorder stopped recording")
        recorder = self.audioRecorder

        AudioServicesPlayAlertSound(1111) // JBL_End

        self.audioRecorder = nil

        do {
            try self.audioSession.setActive(false)
        } catch let error as NSError {
            print("Error - AudioSession setActive False failed -  \(error.debugDescription)")
        }


        if (sender != nil) {
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                sender!.setTitle("Push-to-Talk", forState: .Normal)
            })
        }
    }

但是问题是JBL_Begin警报声音永远不会播放。

另外,当我尝试在录制后播放录制的音频时,音频的音量非常低。这是我的代码:
func pressAudioControl(sender: UIButton!) {
    if audioPlayer.playing {
        audioPlayer.pause()
        self.imageView.image = UIImage(named: "MessagePlay")
    } else {
        do {
            self.audioSession = AVAudioSession.sharedInstance()
            try self.audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: .DefaultToSpeaker)
            try self.audioSession.setActive(true)
            self.audioPlayer.volume = 1.0
            audioPlayer.play()
            self.imageView.image = UIImage(named: "MessagePause")

        } catch let error as NSError {
            print("audioPlayer error \(error.debugDescription)")
        }
    }
}

知道为什么会出现此问题吗?

最佳答案

这是由于尝试播放系统声音时AVAudioSession处于 Activity 状态。您需要完全播放系统声音,然后将其设置为true并开始录制。

AudioServicesPlaySystemSoundWithCompletion(SystemSoundID(1110)) {
    //Recording method here
}

在完成块内,您将在其中运行记录方法,其中包括:
try self.audioSession.setActive(true)

然后,在播放结尾系统声音之前,请确保将其设置回false。
try self.audioSession.setActive(false)

关于swift - Swift-示例-如何在使用AVAudioRecorder录制之前和之后播放提示音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36336133/

相关文章:

ios - 使用像发布其他数据一样的常规方式将数据上传到 Alamofire

ios - Swift 中的 "mutating"函数和 "inout"参数有什么区别吗?

ios - 辅助功能兼容的格式化时间字符串

PHP - 用于使产品 ID 持久化的 session ?

java - 对其他 Spring Boot 应用程序的集中 session 管理

ios - 我可以在 iOS 8 中使用重构的 Storyboard吗?

ios - 如何在导航 View Controller 时获取当前正在运行的 NSURLSession 后台 session ?

flash - 在Flash中将Space插入音频事件

javascript - 动态写入的Web音频链接缓冲区

c++ - 通过 M-Audio ProFire 610 输出声音