在过去,您可以打开/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'
。
我遗漏了什么?如何从声音设备读取和写入原始字节,以及如何选择要使用哪一个?
答案1
此脚本是 PulseAudio 的简单 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 定义(例如,相当于 Audacity 所示的“无符号 8 位”)。如果您有多个通道,则它期望每个通道都有交替的样本。因此,一秒的噪声每个通道有 44100 个样本 = 88200 个样本,其中(模 2 = 0)个样本用于左通道。
请注意,此脚本仅在 Python 3 上运行