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

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

在过去,您可以打开/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 上运行

相关内容