简体   繁体   English

在iOS Playground上使用AVFoundation的Recorder,但recorder.record()始终返回false

[英]Use AVFoundation's Recorder on iOS Playground, but recorder.record() always returns false

Is there anyway to use recorder on iOS Playground? 无论如何,iOS Playground上是否可以使用记录器? When running, it asks my permission to use my microphone, and the recorder instance seems working, however, I can't use the record() function. 运行时,它会征得我使用我的麦克风的许可,并且录音机实例似乎可以运行,但是,我不能使用record()函数。 My current environments are iOS 12.1.4 and Swift 4.2. 我当前的环境是iOS 12.1.4和Swift 4.2。

import UIKit
import PlaygroundSupport
import AVFoundation

class VolumnMeterViewController : UIViewController, AVAudioRecorderDelegate {

    let temporaryDirectoryToKeepRecords = FileManager.default.temporaryDirectory
    var recordButton = UIButton()
    let backgroundView = UIView()
    var recordNumber = 1

    //    var recordingSession: AVAudioSession!
    var recorder: AVAudioRecorder!

    override func loadView() {

        backgroundView.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

        recordButton.setTitle("Record", for: [])
        recordButton.setTitleColor(#colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1), for: [])
        recordButton.addTarget(self, action: #selector(recordButtonTapped), for: .touchUpInside)
        recordButton.translatesAutoresizingMaskIntoConstraints = false
        backgroundView.addSubview(recordButton)

        temporaryDirectoryToKeepRecords

        self.view = backgroundView

        NSLayoutConstraint.activate([
            recordButton.widthAnchor.constraint(equalToConstant: 200),
            recordButton.heightAnchor.constraint(equalToConstant: 60),
            recordButton.centerXAnchor.constraint(equalTo: backgroundView.centerXAnchor),
            recordButton.centerYAnchor.constraint(equalTo: backgroundView.centerYAnchor)
            ])
    }

    @objc func recordButtonTapped() {
        if recorder == nil {

            recordNumber += 1

            let recordFileName = temporaryDirectoryToKeepRecords.appendingPathComponent("record\(recordNumber).m4a")

            recordButton.setTitle("Stop", for: [])
            let settings = [AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 44100, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue]

            do {
                let recorder = try AVAudioRecorder(url: recordFileName, settings: settings)

                // ❗️❗️❗️ Here's the problem. It always return false, assuming to be true.
                recorder.record()
            } catch {
                print(error)
            }
        } else {
            recordButton.setTitle("Record", for: [])
            recorder.stop()
            recorder = nil
        }
    }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = VolumnMeterViewController()

Or is there someway to track the microphone volume not by recording, but just detect live, without storing the record file? 还是有某种方式可以不通过录音来跟踪麦克风的音量,而只是实时检测而不存储录音文件? Thanks a lot! 非常感谢!

Here's finally the working code for iOS Playground, thanks AtulParmar a lot! 这终于是iOS Playground的工作代码,非常感谢AtulParmar!

import UIKit
import PlaygroundSupport
import AVFoundation

class VolumnMeterViewController : UIViewController, AVAudioRecorderDelegate {

    var recordingSession: AVAudioSession!
    let temporaryDirectoryToKeepRecords = FileManager.default.temporaryDirectory
    var recordButton = UIButton()
    let backgroundView = UIView()
    var playButton = UIButton()
    var recordNumber = 1
    var player: AVAudioPlayer!
    var recorder: AVAudioRecorder!

    override func loadView() {

        backgroundView.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

        recordButton.setTitle("Start Recording", for: [])
        recordButton.setTitleColor(#colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1), for: [])
        recordButton.addTarget(self, action: #selector(recordButtonTapped), for: .touchUpInside)
        recordButton.translatesAutoresizingMaskIntoConstraints = false
        backgroundView.addSubview(recordButton)

        playButton.setTitle("Play Record", for: [])
        playButton.setTitleColor(#colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1), for: [])
        playButton.addTarget(self, action: #selector(playButtonTapped), for: .touchUpInside)
        playButton.translatesAutoresizingMaskIntoConstraints = false
        backgroundView.addSubview(playButton)

        self.view = backgroundView

        NSLayoutConstraint.activate([
            recordButton.widthAnchor.constraint(equalToConstant: 200),
            recordButton.heightAnchor.constraint(equalToConstant: 60),
            recordButton.centerXAnchor.constraint(equalTo: backgroundView.centerXAnchor),
            recordButton.centerYAnchor.constraint(equalTo: backgroundView.centerYAnchor, constant: -50),

            playButton.widthAnchor.constraint(equalToConstant: 200),
            playButton.heightAnchor.constraint(equalToConstant: 60),
            playButton.centerXAnchor.constraint(equalTo: backgroundView.centerXAnchor),
            playButton.centerYAnchor.constraint(equalTo: backgroundView.centerYAnchor, constant: 50)
            ])
    }

    @objc func recordButtonTapped() {
        if recorder == nil {
            recordNumber += 1

            let recordFileName = temporaryDirectoryToKeepRecords.appendingPathComponent("record\(recordNumber).m4a")

            recordButton.setTitle("Stop Rocording", for: [])
            let settings = [AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 44100, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue]
            recordingSession = AVAudioSession.sharedInstance()
            do {

                try recordingSession.setCategory(.playAndRecord, mode: .default)
                try recordingSession.setActive(true, options: [])
                recorder = try AVAudioRecorder(url: recordFileName, settings: settings)
                recorder.record()
            } catch {
                print(error)
            }
        } else {
            recordButton.setTitle("Start Recording", for: [])
            recorder.stop()
            recorder = nil
        }
    }

    @objc func playButtonTapped() {
        if player == nil {
            let recordFileName = temporaryDirectoryToKeepRecords.appendingPathComponent("record\(recordNumber).m4a")
            do {
                try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
                try AVAudioSession.sharedInstance().setActive(true)
                player = try AVAudioPlayer(contentsOf: recordFileName)
                player.play()
                playButton.setTitle("Stop Playing", for: [])
            } catch let error {
                print(error)
            }
        } else {
            player = nil
            playButton.setTitle("Play Record", for: [])
        }
    }
}

// Present the view controller in the Live View window
PlaygroundPage.current.liveView = VolumnMeterViewController()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM