如何在IOS中使用OpusCodec编码和解码实时音频?

时间:2019-04-15 15:27:15

标签: ios swift real-time avaudioengine opus

我正在开发具有以下要求的应用程序:

  1. 从iOS设备(iPhone)记录实时音频
  2. 将此音频数据编码为Opus数据,然后通过WebSocket将其发送到服务器
  3. 再次将接收到的数据解码为pcm
  4. 在iOS设备(iPhone)上播放从WebSocket服务器接收到的音频

我为此使用了executePSModule

AVAudioEngine

然后我使用此函数将AVAudioPCMBuffer转换为数据

 var engine = AVAudioEngine()
 var input: AVAudioInputNode = engine.inputNode
 var format: AVAudioFormat = input.outputFormat(forBus: AVAudioNodeBus(0))
 input.installTap(onBus: AVAudioNodeBus(0), bufferSize: AVAudioFrameCount(8192), format: format, block: { buf, when in
 // ‘buf' contains audio captured from input node at time 'when'
 })

 // start engine

我从CocoaPod func toData(PCMBuffer: AVAudioPCMBuffer) -> Data { let channelCount = 1 let channels = UnsafeBufferPointer(start: PCMBuffer.floatChannelData, count: channelCount) let ch0Data = NSData(bytes: channels[0], length:Int(PCMBuffer.frameLength * PCMBuffer.format.streamDescription.pointee.mBytesPerFrame)) return ch0Data as Data } libopus

找到了Opus库

我已经搜索了很多有关如何在IOS中使用OpusCodec的方法,但是还没有解决方案。

如何使用OpusCodec编码和解码此数据?我需要jitterBuffer吗?如果我需要如何在IOS中使用它

此Opus编解码器代码,但声音不太清晰

libopus

2 个答案:

答案 0 :(得分:0)

尝试降低带宽或设置更高的比特率。我认为对于12kHz带宽的单声道音频,16kbit可能太低了。认为最好将带宽设置为与设置的VOIP一起自动运行。周围可能还有其他问题,但是“听起来不好”不足以进行分析。

答案 1 :(得分:0)

我建议使用比特率和带宽。

我已经成功地使它与这里描述的参数一起工作:
https://ddanilov.me/how-to-enable-in-band-fec-for-opus-codec/