【问题标题】:Stream GSM codec audio from network to speakers on the fly即时将 GSM 编解码器音频从网络传输到扬声器
【发布时间】:2019-12-30 17:34:25
【问题描述】:

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

我使用网络流中的 myfile.write(data3) 在硬盘驱动器上写入 .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

【问题讨论】:

    标签: python audio codec


    【解决方案1】:

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

    在发件人处:

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

    在接收方:

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

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

    实现连续录音和播放sounddevice似乎是一个不错的选择。如需录音,请查看InputStreamRawInputStream。如需回放,请查看OutputStreamRawOutputStream

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

    【讨论】:

    • 让我更具体一点:data3 = self.socket.recv(198)
    • 这183个字节中包含了多少个样本?采样率是多少?这将对应于延迟或延迟。你能以连续无间隙的方式播放不同的音频块吗?
    • 采样率为 8000,我不知道音频块,音频在流的中间等时播放正常,它是 TCP 流。我已经通过将所有代码放在那里更新了我的问题,我现在是如何做到的,我使用了 bytesio,但它仍然很糟糕,我可以即时完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多