WebRTC iOS:使用WebRTC录制远程音频流

4

我正在开发一个带有接收功能的音频流应用程序。

当用户想在接收端记录音频流时,我遇到了困难。

以下是我的代码初始化

var engine = AVAudioEngine()
var recordingFile: AVAudioFile?
var audioPlayer: AVAudioPlayer?
let player = AVAudioPlayerNode()
var isRecording: Bool = false

初始化音频引擎

func initializeAudioEngine() {

        let input = self.engine.inputNode
        let format = input.inputFormat(forBus: 0)

        self.engine.attach(self.player)
        let mainMixerNode = self.engine.mainMixerNode
        self.engine.connect(input, to:mainMixerNode, format: format)
        self.engine.prepare()

        do {
            try self.engine.start()
            self.startRecording()
        } catch (let error) {
            print("START FAILED", error)
        }
    }

开始录音。
func startRecording() {

        self.createRecordingFile()

        self.engine.mainMixerNode.installTap(onBus: 0,
                                         bufferSize: 1024,
                                         format: self.engine.mainMixerNode.outputFormat(forBus: 0)) { (buffer, time) -> Void in
            do {
                self.isRecording = true
                try self.recordingFile?.write(from: buffer)
            } catch (let error) {
                print("RECORD ERROR", error);
            }
            return
        }
    }

创建缓冲区
private func createBuffer(forFileNamed fileName: String) -> AVAudioPCMBuffer? {
        var res: AVAudioPCMBuffer?

        if let fileURL = Bundle.main.url(forResource: fileName, withExtension: "caf") {
            do {
                let file = try AVAudioFile(forReading: fileURL)
                res = AVAudioPCMBuffer(pcmFormat: file.processingFormat, frameCapacity:AVAudioFrameCount(file.length))
                if let _ = res {
                    do {
                        try file.read(into: res!)
                    } catch (let error) {
                        print("ERROR read file", error)
                    }
                }
            } catch (let error) {
                print("ERROR file creation", error)
            }
        }
        return res
    }

停止录制。
func stopRecording() {
   self.engine.mainMixerNode.removeTap(onBus: 0)
}

我正在尝试使用耳机进行录音,但是它不起作用。


WebRTC 在接收端不提供任何录制的选项。 - mail2subhajit
请与我们分享您尝试过的内容以及哪些部分没有起作用。同时,请考虑重新表述您的问题。"有人能帮忙吗?"不是正确提问的方式 - normanius
2
@normanius 我尝试使用AVAudioEngine从耳机录制声音,但是它没有起作用。 - Jayesh Mardiya
2个回答

0

它会工作,因为一旦你设置好了

let audiosession = AVAudioSession()

AVAudioSessionCategoryPlayAndRecord 设置为

audiosession.setActive(true)

它将开始记录到设备的任何音频转储。


-2

WebRTC没有任何内部API来启动或停止录制。我们可以尝试使用AVAudioSession代替。

首先设置音频会话

func setUPAudioSession() -> Bool {
      let audiosession = AVAudioSession()
      do {
        try audiosession.setCategory(AVAudioSessionCategoryPlayAndRecord)
      } catch(let error) {
         print("--> \(error.localizedDescription)")
      }
     do {
        try audiosession.setActive(true)
      } catch (let error) {
        print("--> \(error.localizedDescription)")
      }
        return audiosession.isInputAvailable;
}

设置音频会话后,按以下方式开始录音

func startRecording() -> Bool {
      var settings: [String: Any]  = [String: String]()
          settings[AVFormatIDKey] = kAudioFormatLinearPCM
          settings[AVSampleRateKey] = 8000.0
          settings[AVNumberOfChannelsKey] = 1
          settings[AVLinearPCMBitDepthKey] = 16
          settings[AVLinearPCMIsBigEndianKey] = false
          settings[AVLinearPCMIsFloatKey] = false
          settings[AVAudioQualityMax] = AVEncoderAudioQualityKey
    //Create device directory where recorded file will be save   automatically
           let searchPaths: [String] =               NSSearchPathForDirectoriesInDomains(.documentDirectory, .allDomainsMask, true)
         let documentPath_ = searchPaths.first
         let pathToSave = "\(documentPath_)/\(dateString)"
         let url: URL = URL(pathToSave)
         recorder = try? AVAudioRecorder(url: url, settings: settings)
         // Initialize degate, metering, etc.
         recorder.delegate = self;
         recorder.meteringEnabled = true;
         recorder?.prepareToRecord()
         if let recordIs = recorder {
             return recordIs.record()
         }
         return false
  }

播放录制文件

func playrecodingFile() {
    //Get the path of recorded file saved in previous method
    let searchPaths: [String] =    NSSearchPathForDirectoriesInDomains(.documentDirectory, .allDomainsMask, true)
     let documentPath_ = searchPaths.first
     let fileManager = FileManager.default
     let arrayListOfRecordSound: [String]
      if fileManager.fileExists(atPath: recordingFolder()) {
          let arrayListOfRecordSound = try?     fileManager.contentsOfDirectory(atPath: documentPath_)
      }
  let selectedSound = "\(documentPath_)/\(arrayListOfRecordSound.first)"
  let url = URL.init(fileURLWithPath: selectedSound)
  let player = try? AVAudioPlayer(contentsOf: url)
      player?.delegate = self;
      try?  AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
      player?.prepareToPlay()
      player?.play()
}

停止录制

func stopRecording() {
   recorder?.stop()
 }

暂停录制

func pauseRecording() {
    recorder?.pause()
}

停止录制

func stopRecording() {
    recorder?.stop()
}

这样做不起作用,因为AVAudioRecorder记录的是我们说的话,而不是我们正在听的内容。我想要从服务器端记录我们正在听的内容。 - Jayesh Mardiya
它将会工作,因为一旦你设置了 let audiosession = AVAudioSession() 并且设置 AVAudioSessionCategoryPlayAndRecord audiosession.setActive(true) 它将开始录制任何转储到设备的音频。 - Daljeet
它记录音频,是我们在扬声器上说的,而不是从耳机中获取的。顺便说一下:AVAudioSession在WebRTC中变成了RTCAVAudioSession,因此,AudioSession已经存在。 - Jayesh Mardiya
1
@Hardik1344 我也做了同样的事情,但我可以听到录制的声音,我们说话的声音被记录下来了,而不是在WebRTC中记录RTCAVAudioSession。如果您能详细说明一下就好了。 - Sugumaran
@Hardik1344 我遇到了类似的问题。我正在尝试捕获远程音频缓冲区并将其转换为AVAudioPCMBuffer以进行分析。当涉及到本地音频录制时没有问题,但是对于远程音频却无法正常工作。 - BoilingLime
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接