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

2024-10-03 19:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我用myfile.write文件(数据3)从网络流写入硬盘上的.gsm文件。 然后我用pysoundfile把它转换成wav文件

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

在我可以用pyaudio播放之后。它给巨大的延迟,它需要在飞行中,而不是在音频包进来。。你知道吗

我的问题是我如何能直接在飞行中播放的文件流与声音文件?我试着在谷歌搜索所有的只是关于转换文件,有没有办法直接播放它的飞行?任何我能做的建议。谢谢,新年快乐:)

编辑: 现在我有它在飞,但这是坏的。。它会发出很多声音

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

Tags: 文件ioreaddatastreambytessf音频
1条回答
网友
1楼 · 发布于 2024-10-03 19:20:24

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

在发件人处:

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

在接收器处:

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

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

要实现连续录音和回放^{}似乎是一个不错的选择。要录制,请查看InputStreamRawInputStream。对于播放,请查看OutputStreamRawOutputStream。你知道吗

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

相关问题 更多 >