如何将原始字节写入声音设备?

在过去,您曾经能够打开/dev/dsp进行读写,现在,使用PulseAudio,这已不再适用了。

我以为你可以用padsp来做,但是这段代码没有运行:

 import ossaudiodev f = ossaudiodev.open("w") fmt, channels, rate = dsp.setparameters(fmt, channels, rate) 

(通过padsp python script.py运行它)

我得到的错误是No such file or directory: '/dev/dsp'

我错过了什么? 如何从声音设备读取和写入原始字节,以及如何选择要使用的字节?

这个脚本是PulseAudio的Simple API的一个薄包装器。 它允许您将样本写入默认输出:

 #!/usr/bin/env python3 import random import ctypes import struct class NoiseMaker (object): PA_SAMPLE_U8 = 0 PA_STREAM_PLAYBACK = 1 def __init__(self, rate, channels): pat_sample_spec = ctypes.c_buffer(struct.pack("LLB", self.PA_SAMPLE_U8, rate, channels)) self.pa = ctypes.cdll.LoadLibrary("libpulse-simple.so.0") self.s = self.pa.pa_simple_new(0, "App", self.PA_STREAM_PLAYBACK, 0, "App Noise", ctypes.byref(pat_sample_spec), 0, 0,0) def write(self, data): self.pa.pa_simple_write(self.s, data, len(data), 0) def __del__(self): self.pa.pa_simple_free(self.s) one_second_noise = bytes(random.randint(0, 255) for i in range(44100*2)) NoiseMaker(44100, 2).write(one_second_noise) 

速率(44100)定义了实时秒数中的样本数。 它期望字节在0-255(包括0和255)的范围内,由PA_SAMPLE_U8定义(例如,相当于’无符号8位’,如Audacity所示)。 如果您有多个通道,则需要为每个通道交替采样。 因此,一秒钟的噪声每通道有44100个样本= 88200个样本,其中(模2 = 0)用于左声道。

请注意,此脚本仅在Python 3上运行