MacOS录制系统音频及播放(AVFoundation)

159 阅读1分钟
import Cocoa

import AVFoundation


class ViewController: NSViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate {

    var recordButton: NSButton!

    var playButton: NSButton!

    var pauseButton: NSButton!

    var audioPlayer : AVAudioPlayer = AVAudioPlayer()

    let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.m4a")

    private var audioRecorder : AVAudioRecorder!

    

    override func viewDidLoad() {

        super.viewDidLoad()

        recordButton = NSButton(title: "Strar Record", target: self, action: #selector(recordTapped(_:)))

        recordButton.frame = CGRect(x: 50, y: 100, width: 160, height: 50)

        self.view.addSubview(recordButton)


        playButton = NSButton(title: "Play", target: self, action: #selector(playAudio(_:)))

        playButton.frame = CGRect(x: 230, y: 100, width: 100, height: 50)

        self.view.addSubview(playButton)

        

        

        pauseButton = NSButton(title: "Pause", target: self, action: #selector(pauseAudio(_:)))

        pauseButton.frame =  CGRect(x: 350, y: 100, width: 100, height: 50)

        self.view.addSubview(pauseButton)

    }

    

    override var representedObject: Any? {

        didSet {

        // Update the view, if already loaded.

        }

    }

}



extension ViewController{

    @objc private func recordTapped(_ btn: NSButton){

        if audioRecorder == nil {

            startRecording()

        } else {

            finishRecording(success: true)

        }

    }

    

    @objc private func playAudio(_ sender: Any) {

        self.audioPlayer.play()

    }

    

    @objc private func pauseAudio(_ sender: Any) {

        self.audioPlayer.pause()

    }

    

    private func playAudio(forResource: String, ofType: String){

        let url = audioFilename

        do {

            try audioPlayer = AVAudioPlayer(contentsOf: url)

            audioPlayer.delegate = self

            audioPlayer.prepareToPlay()

        } catch let error as NSError {

            print("audioPlayer error \(error.localizedDescription)")

        }

   }

}


func getDocumentsDirectory() -> URL {

    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)

    return paths[0]

}


extension ViewController {

    private func startRecording() {

        let settings = [

                   AVFormatIDKey: Int(kAudioFormatMPEG4AAC),

                   AVSampleRateKey: 12000,

                   AVNumberOfChannelsKey: 1,

                   AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue

               ]

        

        do {

            audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)

            audioRecorder.delegate = self

            audioRecorder.record()

            recordButton.title = "Stop Record"

            } catch {

                finishRecording(success: false)

            }

    }

    

    private func finishRecording(success: Bool) {

       audioRecorder.stop()

       audioRecorder = nil

       if success {// 用户按下按钮停止录音的情况

           recordButton.title = "success,start Record"

           print(audioFilename)

           playAudio(forResource: "recording", ofType: "m4a")

       } else {// 录音失败的情况

           recordButton.title = "fail,start Record"

       }

    }

}