如果使用AVAssetReader,Matplotlib会挂起

时间:2014-12-19 18:05:03

标签: python c++ macos matplotlib core-audio

我有一个库,可以对音频文件执行某些操作。出于测试目的,我创建了一个python接口(使用boost :: python),现在尝试可视化一些数据。

当我尝试制作一些matplotlib图时,我面临以下问题:如果我用库读取媒体文件然后调用matplotlib.pyplot.show() matplotlib UI在它出现后立即挂起:我看到情节但不能关闭/调整大小/与窗口交互,鼠标光标显示“忙轮”。

我发现导致此冻结的行(如果我returnshow()工作正常之前就行了retrun,如果show()在下一行mReader = [[AVAssetReader alloc]initWithAsset:ass error:&mReaderError]; 挂起):

PyEval_SaveThread

所以发生了什么:

  • 原生函数被称为
  • GIL已发布([[AVAssetReader alloc]initWithAsset]
  • PyEval_RestoreThread被称为
  • 重新获取GIL(frame #0: 0x00007fff8b778ef8 CoreFoundation`CFRunLoopRunSpecific + 440 frame #1: 0x00007fff8d7287b7 HIToolbox`ReceiveNextEventCommon + 479 frame #2: 0x00007fff8d7285bc HIToolbox`_BlockUntilNextEventMatchingListInModeWithFilter + 65 frame #3: 0x00007fff8e48524e AppKit`_DPSNextEvent + 1434 frame #4: 0x00007fff8e48489b AppKit`-[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122 frame #5: 0x00007fff8e47899c AppKit`-[NSApplication run] + 553 frame #6: 0x00000001054b3fea _macosx.so`show + 218 frame #7: 0x00000001000997cc Python`PyEval_EvalFrameEx + 17823 frame #8: 0x000000010009d103 Python`fast_function + 203
  • 原生函数返回
  • plt.plot([1])
  • plt.show()

matplotlib挂起。 我很确定库代码本身很好(它经过测试并且在osx和ios上运行良好)但是在使用CoreAudio和“GUI中的某些东西”之间存在一些冲突。

这是被绞死过程的部分回溯:

{{1}}

任何想法有什么不对?

1 个答案:

答案 0 :(得分:0)

这实际上不是答案,而是一种解决方法。它使事情有效但却太难以成为最终的解决方案。

如果在 AVAssetReader之前使用了,则一切正常。我认为在这种情况下正确地初始化了一些东西。

此代码挂起:

data = native_module.get_data_using_coreaudio()
plt.plot(data)
plt.show()

但这不是:

plt.plot([0])
plt.show()
plt.cla()
data = native_module.get_data_using_coreaudio()
plt.plot(data)
plt.show()