如何解决如果从音频回调中绘图,则 tk 中的段错误
这个最小可重复示例:
#!/usr/bin/env python3
from contextlib import contextmanager
import pyaudio
from matplotlib import pyplot as plt
RATE = 44_100
def init_plot():
fig,ax1 = plt.subplots(ncols=1)
broad_line,= ax1.loglog([],[])
def plot():
x = [0]*32
broad_line.set_xdata(x)
broad_line.set_ydata(x)
print('Drawing...')
# Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
fig.canvas.draw()
print('Done.')
return plot
def audio_cb(plot):
def cb(*args):
try:
plot()
flag = pyaudio.paContinue
except RuntimeError as e:
print(e)
flag = pyaudio.paComplete
out_data = None
return out_data,flag
return cb
@contextmanager
def init_audio(n_frames: int,cb):
audio = pyaudio.PyAudio()
stream = audio.open(
input=True,rate=RATE,channels=1,format=pyaudio.paFloat32,frames_per_buffer=n_frames,stream_callback=cb,)
try:
yield
finally:
stream.close()
audio.terminate()
def main():
n_frames = 32768
plot = init_plot()
with init_audio(n_frames,audio_cb(plot)):
plt.show(block=True)
main()
每次都在指示的地方崩溃。它杀死了 Python 本身。来自 gdb
的堆栈跟踪是
#0 0x00007fffc3371ce5 in Tk_GetImageMasterData () from /usr/lib/libtk8.6.so
#1 0x00007fffc337d2dd in Tk_FindPhoto () from /usr/lib/libtk8.6.so
#2 0x00007fffc2909966 in mpl_tk_blit (self=<optimized out>,args=<optimized out>) at src/_tkagg.cpp:64
#3 0x000055555577020d in cfunction_call (func=0x7fffc2b30e00,args=<optimized out>,kwargs=<optimized out>)
at Objects/methodobject.c:546
#4 0x00005555555c5d50 in _PyObject_MakeTpCall (tstate=0x7fff98023060,callable=0x7fffc2b30e00,nargs=<optimized out>,keywords=0x0) at Objects/call.c:191
...
#37 0x00007fffe2b13674 in _stream_callback_cfunction (input=0x555556beea30,output=0x0,frameCount=32768,timeInfo=<optimized out>,statusFlags=<optimized out>,userData=<optimized out>) at src/_portaudiomodule.c:1302
#38 0x00007fffdfd8cdc8 in ?? () from /usr/lib/libportaudio.so.2
#39 0x00007fffdfd8ea51 in ?? () from /usr/lib/libportaudio.so.2
#40 0x00007fffdfd9646b in ?? () from /usr/lib/libportaudio.so.2
#41 0x00007ffff7f453e9 in start_thread () from /usr/lib/libpthread.so.0
#42 0x00007ffff7d22293 in clone () from /usr/lib/libc.so.6
我应该基本上放弃尝试从 PortAudio 回调调用 matplotlib
吗?如果是这样,我怎样才能最好地将音频数据从回调传递到渲染线程?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。