使用pyaudi时块、样本和框架是什么

2024-05-17 09:31:13 发布

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

在浏览了pyaudio的文档并阅读了网络上的其他一些文章之后,我对自己的理解是否正确感到困惑。

这是pyaudio站点上的音频录制代码:

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()

如果我加上这些台词,我就能播放我录制的任何内容:

play=pyaudio.PyAudio()
stream_play=play.open(format=FORMAT,
                      channels=CHANNELS,
                      rate=RATE,
                      output=True)
for data in frames: 
    stream_play.write(data)
stream_play.stop_stream()
stream_play.close()
play.terminate()
  1. “RATE”是每秒采集的样本数。
  2. “CHUNK”是缓冲区中的帧数。
  3. 每帧将有2个样本作为“通道=2”。
  4. 每个样本的大小为2字节,使用函数pyaudio.get_sample_size(pyaudio.paInt16)计算。
  5. 所以每帧的大小是4字节。
  6. 在“frames”列表中,每个元素的大小必须是1024*4字节,例如,frames[0]的大小必须是4096字节。然而, sys.getsizeof(frames[0])返回4133,但是len(frames[0])返回4096
  7. for循环执行int(RATE / CHUNK * RECORD_SECONDS)次,我不明白为什么。Here与“Ruben Sanchez”回答的问题相同,但我不能确定它是否如他所说的那样正确。根据他的解释,它必须是int(RATE / (CHUNK*2) * RECORD_SECONDS),因为(CHUNK*2)是每次迭代在缓冲区中读取的样本数。
  8. 最后,当我写print frames[0]时,当它试图将字符串视为ASCII编码时,它会打印出乱七八糟的内容,而不是,它只是一个字节流。那么如何使用struct模块以十六进制形式打印这个字节流呢?如果以后,我用自己选择的值更改每个十六进制值,它还会发出可播放的声音吗?

无论我写在上面的是我对事情的理解,其中很多可能是错的。


Tags: formatforplaydatastreamframes字节rate
1条回答
网友
1楼 · 发布于 2024-05-17 09:31:13
  1. “RATE”是“采样率”,即每秒的数目
  2. “CHUNK”是(任意选择的)帧数,在本例中,(可能很长)信号被分成
  3. 是的,每帧将有2个样本作为“CHANNELS=2”,但是术语“samples”很少用于此上下文(因为它很混乱)
  4. 是的,在本例中,每个样本的大小是2字节(=16位)
  5. 是的,每帧的大小是4字节
  6. 是的,“帧”的每个元素都应该是4096字节。sys.getsizeof()报告Python解释器所需的存储空间,通常比原始数据的实际大小大一点。
  7. RATE * RECORD_SECONDS是应记录的帧数。由于for循环不是针对每个帧而重复,而是仅针对每个,因此循环数必须除以块大小CHUNK。这与样本无关,因此不涉及2因素。
  8. 如果您真的想查看十六进制值,可以尝试[hex(x) for x in frames[0]]这样的方法。如果要获取实际的2字节数字,请使用格式字符串'<H'struct模块。

您可能对我的关于使用wave模块读取WAV文件的教程感兴趣,该教程更详细地介绍了您的一些问题:http://nbviewer.jupyter.org/github/mgeier/python-audio/blob/master/audio-files/audio-files-with-wave.ipynb

相关问题 更多 >