代码之家  ›  专栏  ›  技术社区  ›  Amey

iOS录制现场麦克风数据无法录制和发送?

  •  0
  • Amey  · 技术社区  · 6 年前
    import UIKit
    import AVFoundation
    
    class RecViewController: UIViewController,AVCaptureAudioDataOutputSampleBufferDelegate {
    
        @IBOutlet weak var recBtn: UIButton!
    
        let session = AVCaptureSession()
        var result: NSData?
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.recBtn.setTitle("RECORDING", for: .normal)
        }
    
        @IBAction func recBtnAction(_ sender: Any) {
    
            session.sessionPreset = .medium
    
            let mic = AVCaptureDevice.default(for: .audio)
            var mic_input: AVCaptureDeviceInput!
    
            let audio_output = AVCaptureAudioDataOutput()
            audio_output.setSampleBufferDelegate(self, queue: DispatchQueue.main)
    
            do {
                mic_input = try AVCaptureDeviceInput(device: mic!)
            } catch {
                return
            }
    
            if session.inputs.isEmpty {
                self.session.addInput(mic_input)
                session.addOutput(audio_output)
            }
    
            session.startRunning()
    
        }
        func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    
            let block = CMSampleBufferGetDataBuffer(sampleBuffer)
            var length = 0
            var data: UnsafeMutablePointer<Int8>? = nil
    
            var status = CMBlockBufferGetDataPointer(block!, 0, nil, &length, &data)    // TODO: check for errors
    
            result = NSData(bytesNoCopy: data!, length: length, freeWhenDone: false)
        }
    
        @IBAction func playBtnAction(_ sender: Any) {
            // Storing the ns data and trying to play with following code but it dosent play cant hear a thing
            do {
                let audioPlayer = try AVAudioPlayer(data: result as! Data )
                audioPlayer.prepareToPlay()
                audioPlayer.play()
            } catch {
                print("Error")
            }
        }
    
    }
    

    我用这段代码来记录麦克风的实时数据,但是当我按下rec按钮时什么也没有发生,它既不记录也不去委托和打印,所以如何解决这个问题?(解决)

    我已经更新了代码,当我试图通过av音频播放器播放ns数据时,它不会播放任何内容如何解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  1
  •   MultiColourPixel    6 年前

    看起来不像是你的 audio_output 实际上是由 recBtnAction 方法。很可能您的会话在离开方法时被丢弃,因此不会为您捕获任何内容。


    编辑

    在对您提供的示例代码进行了分析之后,您的实际问题似乎是您使用的委托方法的签名错误。

    应该是:

    func captureOutput(_ output: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
    }