sounddevice 中的定时模块函数和回调流

问题描述

我在 macOS Mojave 上尝试输入特定时刻。在我正在开发的应用程序中,我需要在回调函数和 Python 模块中的其他函数中触发特定操作/函数后存储时间。我的目标是在同一时间轴上创建三个不同的图。

我理解:时间(在回调参数列表中)值是单调递增的,并且具有未指定的原点,即来自回调参数的 time.currentTime。我也读过:

PortAudio 流回调以非常高或实时的优先级运行。它需要始终如一地满足其时间期限。不要分配内存、访问文件系统、调用函数或从流回调调用其他函数,这些函数可能会阻塞或需要不可预测的时间才能完成。除了 cpu_load 之外,不允许从流回调中调用 PortAudio API 函数

一种方法是在回调函数和其他函数中使用相同的时间:

import sounddevice as sd
import time
duration = 5.5  # seconds

times = list()
def callback(indata,outdata,frames,time,status):
    global times
    if status:
        print(status)
    times.append(time.time())
    outdata[:] = indata

with sd.Stream(channels=2,callback=callback):
    sd.sleep(int(duration * 1000))

然而,这会产生以下错误

输入溢出 来自 cffi 回调 init..callback_ptr at 0x109a00dd0>: 回溯(最近一次调用最后一次): 文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sounddevice.py”,第881行,在callback_ptr 回调、idata、odata、帧、时间、状态) _wrap_callback 中的文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sounddevice.py”,第 2678 行 回调(*参数) 文件“timed_callbackex.py”,第 11 行,在回调中 时间。追加(时间。时间()) AttributeError: cdata 'struct PaStreamCallbackTimeInfo *' 没有字段 'time'

因此,出于开发目的,你们对蒸汽的计时和其他动作的建议是什么,因为音频蒸汽输入是从麦克风中处理的?

任何帮助将不胜感激。

解决方法

您的回调函数存在问题。由于 sounddevice 回调函数有一个参数“time”,它与模块“time”冲突。我建议您将导入时间名称更改为其他名称作为快速修复:

import sounddevice as sd
import time as tm
duration = 5.5  # seconds

times = list()
def callback(indata,outdata,frames,time,status):
    global times
    if status:
        print(status)
    times.append(tm.time())
    outdata[:] = indata

with sd.Stream(channels=2,callback=callback):
    sd.sleep(int(duration * 1000)) 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...