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

Ste*_*zzo 5 sound programming pulseaudio

在过去,您曾经可以打开/dev/dsp进行阅读和写作,现在,有了 PulseAudio,这不再起作用。

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

import ossaudiodev

f = ossaudiodev.open("w")
fmt, channels, rate = dsp.setparameters(fmt, channels, rate)
Run Code Online (Sandbox Code Playgroud)

(通过运行它padsp python script.py

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

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

Ste*_*zzo 5

这个脚本是围绕 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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 作为旁注,如果您有兴趣在终端上使用声音处理,您可以使用 `pacat` 工具编写或读取原始音频。 (2认同)