将生成的音频数据从 float 打包到 str
Packing generated audio data from float to str
任务是生成音频数据,让pyaudio
播放。步骤:
1.生成声音数据
2. 将它们转换为字符串,这样
3. pyaudio stream
可以玩
第一个很清楚,并且都适用于例如此代码:
for x in xrange(NUMBEROFFRAMES):
WAVEDATA = WAVEDATA+chr(int(math.sin(2*x/((BITRATE/FREQUENCY)/math.pi))*127+128))
p = PyAudio()
stream = p.open(format = p.get_format_from_width(1),
channels = 1,
rate = BITRATE,
output = True)
stream.write(WAVEDATA)
但我想要比 0...255 更宽的范围,这是 chr
的限制
.
有什么好主意吗?
我试过了:
WAVEDATA = WAVEDATA+struct.pack('f',math.sin(2*x/((BITRATE/FREQUENCY)/math.pi)))
但它不起作用,它只播放噪音。我哪里弄错了。
好吧,实际上它很简单(几乎是愚蠢的)。我找到了两个选项:
1. 这是如何做这样的事情的好例子:http://milkandtang.com/blog/2013/02/16/making-noise-in-python/
2. 或者只是这样做(定义 NUMBEROFFRAMES、BITRATE 和 FREQUENCY):
import math
import pyaudio
import struct
for x in xrange(NUMBEROFFRAMES):
WAVEDATA = WAVEDATA+struct.pack('f',(math.sin(2*x/((BITRATE/FREQUENCY)/math.pi)))
p = PyAudio()
stream = p.open(format = p.get_format_from_width(4),
channels = 1,
rate = BITRATE,
output = True)
stream.write(WAVEDATA)
我的愚蠢错误是在使用浮点数时,我在 get_format_from_width
中留下了 1。应该是4.
任务是生成音频数据,让pyaudio
播放。步骤:
1.生成声音数据
2. 将它们转换为字符串,这样
3. pyaudio stream
可以玩
第一个很清楚,并且都适用于例如此代码:
for x in xrange(NUMBEROFFRAMES):
WAVEDATA = WAVEDATA+chr(int(math.sin(2*x/((BITRATE/FREQUENCY)/math.pi))*127+128))
p = PyAudio()
stream = p.open(format = p.get_format_from_width(1),
channels = 1,
rate = BITRATE,
output = True)
stream.write(WAVEDATA)
但我想要比 0...255 更宽的范围,这是 chr
的限制
.
有什么好主意吗?
我试过了:
WAVEDATA = WAVEDATA+struct.pack('f',math.sin(2*x/((BITRATE/FREQUENCY)/math.pi)))
但它不起作用,它只播放噪音。我哪里弄错了。
好吧,实际上它很简单(几乎是愚蠢的)。我找到了两个选项:
1. 这是如何做这样的事情的好例子:http://milkandtang.com/blog/2013/02/16/making-noise-in-python/
2. 或者只是这样做(定义 NUMBEROFFRAMES、BITRATE 和 FREQUENCY):
import math
import pyaudio
import struct
for x in xrange(NUMBEROFFRAMES):
WAVEDATA = WAVEDATA+struct.pack('f',(math.sin(2*x/((BITRATE/FREQUENCY)/math.pi)))
p = PyAudio()
stream = p.open(format = p.get_format_from_width(4),
channels = 1,
rate = BITRATE,
output = True)
stream.write(WAVEDATA)
我的愚蠢错误是在使用浮点数时,我在 get_format_from_width
中留下了 1。应该是4.