Я использую библиотеку EZAudio для записи голоса и его воспроизведения. Я хочу получать каждые 20 мс записанных данных в виде NsData или [UInt8] и отправлять их на сервер, а затем воспроизводить. Я не знаю, как играть с EZAudio.
var microphone : EZMicrophone!
var output : EZOutput!
let inputDevices = EZAudioDevice.inputDevices()
let currentInputDevice = EZAudioDevice.currentInput()//this will default to the headset device or bottom microphone
let outputDevices = EZAudioDevice.outputDevices()
let currentOutputDevice = EZAudioDevice.currentOutput()//this will default to the
let streamFormat = AudioStreamBasicDescription(
mSampleRate: 12000.0,
mFormatID: kAudioFormatLinearPCM,
mFormatFlags: kAudioFormatFlagIsSignedInteger,
mBytesPerPacket: 2,
mFramesPerPacket: 1,
mBytesPerFrame: 2,
mChannelsPerFrame: 1,
mBitsPerChannel: 16,
mReserved: 0)//microphone format.
microphone = EZMicrophone(delegate: self, with: streamFormat)
output = EZOutput(dataSource: self)
Первый вопрос: я не знаю, как установить эти 2 свойства: (mFormatID, mFormatFlags), и я предполагаю, что я установил эту AudioStreamBasicDescription для вывода. но я не уверен
func record(){
microphone.microphoneOn = true
microphone.startFetchingAudio()
}
func play(){
if(!output.isPlaying){
output.startPlayback()
}
}
func stopPlaying(){
if(output.isPlaying){
output.stopPlayback()
}
}
func stop(){
microphone.stopFetchingAudio()
microphone.microphoneOn = false
}
func microphone(_ microphone: EZMicrophone!,
hasBufferList bufferList: UnsafeMutablePointer<AudioBufferList>!,
withBufferSize bufferSize: UInt32,
withNumberOfChannels numberOfChannels: UInt32) {
let audio = NSData(bytes: bufferList.pointee.mBuffers.mData,
length: Int(bufferList.pointee.mBuffers.mDataByteSize))//NsData
audioNSDataArray.append(audio)//NsData
}
Я знаю, что для воспроизведения голоса мне нужно заполнить этот метод, но я не могу найти как.
func output(_ output: EZOutput!,
shouldFill audioBufferList: UnsafeMutablePointer<AudioBufferList>!,
withNumberOfFrames frames: UInt32,
timestamp: UnsafePointer<AudioTimeStamp>!) -> OSStatus {
//how to playback recorded voice ???
return noErr
}