【问题标题】:Record voice in background(when i tapped home button) using AVAudioRecorder使用 AVAudioRecorder 在后台录制语音(当我点击主页按钮时)
【发布时间】:2013-04-29 10:41:30
【问题描述】:

我是 IOS 开发新手。我正在尝试使用 AVAudioRecorder 在后台录制用户语音,但我将“音频”添加到 UIBackgroundModes 但这没有帮助。顺便说一句,一切都在前台工作完美。当在后台时,计时器工作正常,但没有录音。 如何从背景的麦克风录制?这可能吗?

【问题讨论】:

  • 请添加一些信息,你是如何尝试的(最好是一些代码)

标签: objective-c xcode


【解决方案1】:

你可以。 Skype 会这样做。

您大概需要在 Info.plist 中设置<key>UIBackgroundModes</key><array><string>audio</string></array>,并且您需要确保在切换应用程序之前音频会话处于活动/运行/任何状态(假设您不会突然开始录制/播放音乐/无论您的应用何时在后台运行)。

The docs 说“音频”可以让您在后台播放音频,但大概这也适用于录制音频。如果它不起作用,您可以尝试一些方法:

  • 同时设置“voip”和“audio”。
  • 播放静音(这可能是使用音频队列 API 最简单的方法)。

此素材来自这里:iOS multitasking for an Audio Recording application

额外材料见:he recording stops as soon as I press the "HOME" button Building Background-Aware Applications

【讨论】:

    【解决方案2】:

    您需要在应用程序 plist 文件中将 UIBackgroundModes 设置为音频。

    【讨论】:

    • 你能显示你的 UIBackgroundModes 行的截图部分吗?还要注意 UIBackgroundModes 从 ios 4.0 开始工作
    • sry,我不能发布截图,因为我是新用户。如果我有 10 名声望,我会发布截图。
    • 如果您已经完成此任务,请发布示例代码,仅在背景中录制语音
    • 代码没有区别,代码是一样的,唯一不同的是 UIBackgroundModes ,也就是说应用程序也可以在后台运行。
    • 我在 info.plist 中输入了 UIBackgroundModes 它自动更改了 Require background mode-->item 0 ->App 播放音频
    【解决方案3】:

    是的,当应用程序在后台运行时,可以同时录制和播放。首先,您需要为您的应用启用后台模式,请使用以下步骤。

    -- 在 Xcode 的 Navigator 中选择您的项目文件。然后,从 Capabilities 部分,打开 Background Modes 子部分。在为您提供背景模式列表后,勾选 Audio & Airplay 开关。

    -- 使用以下代码在应用程序的前台和后台状态下录制和播放音频。如果设备处于静音模式或用户锁定设备,下面的代码还会录制和播放音频。

    import UIKit
    import AVFoundation
    
    extension String {
    
           func stringByAppendingPathComponent(path: String) -> String {
    
                 let nsSt = self as NSString
                 return nsSt.stringByAppendingPathComponent(path)
           }
    }
    
    class ViewController: UIViewController, AVAudioPlayerDelegate, AVAudioRecorderDelegate{
    
    var audioPlayer : AVAudioPlayer!
    var audioRecorder : AVAudioRecorder!
    
    @IBOutlet var recordButton : UIButton!
    @IBOutlet var playButton : UIButton!
    @IBOutlet var stopButton : UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.recordButton.enabled = true
        self.playButton.enabled = false
        self.stopButton.enabled = false
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    //MARK: UIButton action methods
    
    @IBAction func playButtonClicked(sender : AnyObject){
    
        let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        dispatch_async(dispatchQueue, {
    
            if let data = NSData(contentsOfFile: self.audioFilePath())
            {
                do{
                    let session = AVAudioSession.sharedInstance()
    
                    try session.setCategory(AVAudioSessionCategoryPlayback)
                    try session.setActive(true)
    
                    self.audioPlayer = try AVAudioPlayer(data: data)
                    self.audioPlayer.delegate = self
                    self.audioPlayer.prepareToPlay()
                    self.audioPlayer.play()
                }
                catch{
                    print("\(error)")
                }
            }
        });
    }
    
    @IBAction func stopButtonClicked(sender : AnyObject){
    
        if let player = self.audioPlayer{
            player.stop()
        }
    
        if let record = self.audioRecorder{
    
            record.stop()
        }
    
        let session = AVAudioSession.sharedInstance()
        do{
            try session.setActive(false)
        }
        catch{
            print("\(error)")
        }
    }
    
    @IBAction func recordButtonClicked(sender : AnyObject){
    
        let session = AVAudioSession.sharedInstance()
    
        do{
            try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
            try session.setActive(true)
            session.requestRecordPermission({ (allowed : Bool) -> Void in
    
                if allowed {
                    self.startRecording()
                }
                else{
                    print("We don't have request permission for recording.")
                }
            })
        }
        catch{
            print("\(error)")
        }
    }
    
    func startRecording(){
    
        self.playButton.enabled = false
        self.recordButton.enabled = false
        self.stopButton.enabled = true
    
        do{
    
            let fileURL = NSURL(string: self.audioFilePath())!
            self.audioRecorder = try AVAudioRecorder(URL: fileURL, settings: self.audioRecorderSettings() as! [String : AnyObject])
    
            if let recorder = self.audioRecorder{
                recorder.delegate = self
    
                if recorder.record() && recorder.prepareToRecord(){
                    print("Audio recording started successfully")
                }
            }
        }
        catch{
            print("\(error)")
        }
    }
    
    func audioFilePath() -> String{
    
        let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
        let filePath = path.stringByAppendingPathComponent("test.caf") as String
    
        //let filePath = NSBundle.mainBundle().pathForResource("mySong", ofType: "mp3")!
        return filePath
    }
    
    func audioRecorderSettings() -> NSDictionary{
    
        let settings = [AVFormatIDKey : NSNumber(int: Int32(kAudioFormatMPEG4AAC)), AVSampleRateKey : NSNumber(float: Float(16000.0)), AVNumberOfChannelsKey : NSNumber(int: 1), AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.Medium.rawValue))]
    
        return settings
    }
    
    //MARK: AVAudioPlayerDelegate methods
    
    func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
    
        if flag == true{
            print("Player stops playing successfully")
        }
        else{
            print("Player interrupted")
        }
    
        self.recordButton.enabled = true
        self.playButton.enabled = false
        self.stopButton.enabled = false
    }
    
    //MARK: AVAudioRecorderDelegate methods
    
    func audioRecorderDidFinishRecording(recorder: AVAudioRecorder, successfully flag: Bool) {
    
        if flag == true{
            print("Recording stops successfully")
        }
        else{
            print("Stopping recording failed")
        }
    
        self.playButton.enabled = true
        self.recordButton.enabled = false
        self.stopButton.enabled = false
    }
    }
    

    只需复制此代码并将其粘贴到空视图控制器 swift 文件中,在 xib 文件或故事板文件中创建三个按钮“记录”、“停止”、“播放”,连接@IBOutlet 和@IBAction。 在真实设备上测试此代码,因为您需要麦克风来录制音频。 我已经针对 xCode 7 和 iOS 9 及其工作进行了测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多