使用字节数组播放声音
Play sound using bytes array
如何在 Python 中使用字节数组播放声音。更准确地说,我从套接字中读取了一个字节数组,我想将其转换为声音以理解它。我怎样才能做到这一点?
任何库都会有用。
Try PyAudio which is a binding for PortAudio.
我用过for creating audio conferences,效果很好。
深入调查表明这是最适合实时处理原始音频数据的库。
official docs in Examples section提供了几个例子。
由于您要从套接字中获取数据,因此您需要先对其进行缓冲。这意味着,您不断地从套接字读取数据并将其放入某个缓冲区。
您可能需要一些机制来防止您的缓冲区增长太多,即使用循环缓冲区等。但这必须小心进行,因为如果声音输出设备与输入数据的速度相比较慢,您可能会遇到声音剪辑。
在您的缓冲区中获得一些数据后,您将需要回放它。最好的方法是告诉音频驱动程序在设备准备好使用数据时获取数据。这是通过指定一个回调来完成的,该回调将为设备 return 一大块数据。
所以,请参阅官方文档中的 Play (Callback)
示例。
该示例描述性很强,但可能无法回答您的所有问题。因此,我将逐步指导您完成我的代码:
这里可以看到input=True
参数:你不需要这个,因为你只需要播放声音。
还有一个参数stream_callback
指向on_audio_ready
方法。此方法由 pyaudio 在单独的线程中调用。 It pulls data from buffer and returns it to caller. Note: you need to return as much data, as output device is ready to consume (in_data
). In my code, if there is less data available, than it is needed, then silence data is appended,
- 通过调用其
.start_stream()
方法启动您的流。我用过 Twisted 库,所以 it may look a bit weird for you.
试试这个片段,其中变量音频是字节流
import IPython.display as ipd
ipd.Audio(audio)
如何在 Python 中使用字节数组播放声音。更准确地说,我从套接字中读取了一个字节数组,我想将其转换为声音以理解它。我怎样才能做到这一点?
任何库都会有用。
Try PyAudio which is a binding for PortAudio.
我用过for creating audio conferences,效果很好。
深入调查表明这是最适合实时处理原始音频数据的库。
official docs in Examples section提供了几个例子。
由于您要从套接字中获取数据,因此您需要先对其进行缓冲。这意味着,您不断地从套接字读取数据并将其放入某个缓冲区。
您可能需要一些机制来防止您的缓冲区增长太多,即使用循环缓冲区等。但这必须小心进行,因为如果声音输出设备与输入数据的速度相比较慢,您可能会遇到声音剪辑。
在您的缓冲区中获得一些数据后,您将需要回放它。最好的方法是告诉音频驱动程序在设备准备好使用数据时获取数据。这是通过指定一个回调来完成的,该回调将为设备 return 一大块数据。
所以,请参阅官方文档中的 Play (Callback)
示例。
该示例描述性很强,但可能无法回答您的所有问题。因此,我将逐步指导您完成我的代码:
这里可以看到input=True
参数:你不需要这个,因为你只需要播放声音。
还有一个参数stream_callback
指向on_audio_ready
方法。此方法由 pyaudio 在单独的线程中调用。 It pulls data from buffer and returns it to caller. Note: you need to return as much data, as output device is ready to consume (in_data
). In my code, if there is less data available, than it is needed, then silence data is appended,
- 通过调用其
.start_stream()
方法启动您的流。我用过 Twisted 库,所以 it may look a bit weird for you.
试试这个片段,其中变量音频是字节流
import IPython.display as ipd
ipd.Audio(audio)