我有一个非常奇怪的问题,我设法像这样尽可能地减少了这个问题:

import sounddevice
import time

class SamplerBox:
    def __init__(self):
        self.samples = {}

    def audio_callback(self, outdata, frame_count, time_info, status):
        print('ac')

    def init(self):
        self.connect_audio_output()
        self.load_samples()
        time.sleep(20)

    def connect_audio_output(self):
        try:
            sd = sounddevice.OutputStream(callback=self.audio_callback)
            sd.start()
            print('Opened audio device')
        except:
            print('Invalid audio device')
            exit(1)

    def load_samples(self):
        for midinote in range(128):
            for velocity in range(128):
                self.samples[midinote, velocity] = Sound()


class Sound:
    def __init__(self):
        pass


sb = SamplerBox()
sb.init()

一旦我创建了那个大的self.samples字典,并且只创建了一个带有空回调的新音频流,我就得到了"Bus Error 10"和Python3.11.

在使用Python3.9时,我得到的是"非法指令4"

在我的原始脚本中(这里减少了),我得到了"分段错误11"

我在MacOS 10.15.7上运行的是Homebrew Python3.11.

更糟糕的是,100:

import sounddevice
import time

samples = {}


class Sound:
    def __init__(self):
        pass

def audio_callback(self, outdata, frame_count, time_info, status):
    print('ac')


try:
    sd = sounddevice.OutputStream(callback=audio_callback)
    sd.start()
    print('Opened audio device')
except:
    print('Invalid audio device')
    exit(1)

for midinote in range(128):
    for velocity in range(128):
        samples[midinote, velocity] = Sound()

time.sleep(20)

有什么主意吗?

推荐答案

您没有保留对在connect_audio_output中创建的输出流对象的引用,因此当该方法完成时,与local variable sd相关联的sounddevice.OutputStream对象将丢失其所有引用,并最终将被GC收集.

使对象保持活动状态,例如通过将其分配给实例属性:

def connect_audio_output(self):
    try:
        self.sd = sounddevice.OutputStream(callback=self.audio_callback)
        self.sd.start()
        print('Opened audio device')
    except:
        print('Invalid audio device')
        exit(1)

在您的过程性方法sd,is a global variable中,所以只要进程存在,对象就会一直存在.

Python相关问答推荐

Python -Polars库中的滚动索引?

对Numpy函数进行载体化

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

如何将双框框列中的成对变成两个新列

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

沿着数组中的轴计算真实条目

用合并列替换现有列并重命名

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

使用groupby Pandas的一些操作

Python键入协议默认值

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

删除marplotlib条形图上的底边

Matplotlib中的字体权重

手动设置seborn/matplotlib散点图连续变量图例中显示的值

如何使用OpenGL使球体遵循Python中的八样路径?

如何在Great Table中处理inf和nans

递归函数修饰器

如何在PythonPandas 中对同一个浮动列进行逐行划分?

删除Dataframe中的第一个空白行并重新索引列

Django更新视图未更新