即时将 GSM 编解码器音频从网络流式传输到扬声器



我用python做VoIP软件,我尝试重新创建一个特定的业余无线电节目协议,它使用GSM音频编解码器。 由于 Python 没有简单的方法来播放 GSM 文件,但我设法至少用它转换了一个文件,所以我知道这是可能的。

我使用来自Network Stream的MyFile.write(Data3(在硬盘驱动器上写入.gsm文件。 然后我使用pysoundfile将其转换为WAV文件

data, samplerate = sf.read('temppi.gsm')
sf.write('temppi.wav', data, samplerate)

在我可以用 pyaudio 播放它之后。 它提供了巨大的延迟,它需要在飞行中而不是在音频数据包进入之后。

我的问题如何即时播放带有声音文件的流中的文件? 我尝试搜索Google,所有这些都只是关于转换文件,没有办法即时播放它? 任何建议我能做什么。 谢谢,新年快乐:)

编辑: 现在我把它放在飞行中,但这很糟糕。它做了很多分块声音

here we start thread aaniulos
if ekabitti == b'x01':
dataaa = self.socket.recv(198)
data3 = io.BytesIO(bytes(dataaa))
while True:
global aani
#global data3
if aani:
print ('Ääni saije lopetetaan..')
break
data, samplerate = sf.read(io.BytesIO(bytes(data3.getbuffer())), format = 'RAW', channels = 1, samplerate=8000, dtype ='int16', subtype='GSM610', endian ='FILE')
virtuaalifilu = io.BytesIO()
sf.write (virtuaalifilu, data, 8000, format='wav', subtype= 'PCM_16')
sound_file = io.BytesIO(bytes(virtuaalifilu.getbuffer()))
print ('striimataan ääntä nyt kaijuttimiin!!!')
stream.stop_stream()  
stream.close()
return

由于您省略了很多细节,我只能猜测您的实现是如何工作的。听起来你做得不正确。我的猜测是,您经历的巨大延迟是因为您在每个数据包中发送了太多音频,甚至可能是整个音频文件?要实现低延迟的音频流,您基本上需要遵循以下粗略的方案:

在发件人处:

  1. 将音频录制到缓冲区。
  2. 以预定义长度的块连续切片缓冲区,例如 20 毫秒。
  3. 使用合适的音频编解码器(例如 GSM(对每个块进行编码。
  4. 将数据包中的每个块发送到接收方,最好使用基于数据报的协议(如 UDP(。

在接收器处:

  1. 从网络读取数据包(如果可用(。
  2. 将每个数据包解码为原始音频数据,并将其放入音频缓冲区中。
  3. 连续播放音频缓冲区中的音频。

如果使用UDP作为传输协议,则还需要处理数据包丢失和无序数据包。根据延迟要求,您可能还可以使用(或至少尝试(TCP 来发送每个音频块。

要实现连续的音频录制和播放sounddevice似乎是一个不错的选择。要录制,请查看InputStreamRawInputStream。要播放,请查看OutputStreamRawOutputStream.

可能仍然可以使用SoundFile从 GSM 编解码器转换为原始音频,但您需要为每个块执行此操作。并且块必须非常小,例如 20 毫秒。

最新更新