WebRT C iOS: запись удаленного аудиопотока с использованием WebRTC - PullRequest
2 голосов
/ 09 января 2020

Я работаю над приложением потокового аудио с функцией записи для приемника.

Я застрял в точке, где пользователь хочет записать аудиопоток на стороне приемника.

Ниже мой код Инициализация

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

Инициализация AudioEngine

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)
}

Я пытаюсь записать, используя наушники, но это не работает

1 Ответ

0 голосов
/ 15 января 2020

WebRT C не имеет внутреннего 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()
 }

pauseRecording

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

Остановить запись

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