Python — Matplotlib зависает, если используется AVAssetReader

У меня есть библиотека, которая выполняет некоторые действия с аудио файлами. В целях тестирования я создал интерфейс Python (используя boost :: python) и теперь пытаюсь визуализировать некоторые данные.

Когда я попытался создать несколько графиков matplotlib, я столкнулся со следующей проблемой: если я читаю медиафайл с библиотекой, а затем вызываю matplotlib.pyplot.show() Пользовательский интерфейс matplotlib зависает сразу после его появления: я вижу график, но не могу закрыть / изменить размер / взаимодействовать с окном, курсор мыши показывает «занятое колесо».

Я нашел строку, вызывающую это замораживание (если я return на линию раньше show() отлично работает и если retrun на следующей строке show() висит):

mReader  = [[AVAssetReader alloc]initWithAsset:ass error:&mReaderError];

Итак, что происходит:

  • нативная функция называется
  • GIL выпущен (PyEval_SaveThread)
  • [[AVAssetReader alloc]initWithAsset] называется
  • GIL повторно приобретен (PyEval_RestoreThread)
  • нативная функция возвращает
  • plt.plot ([1])
  • plt.show ()

И матплотлиб виснет.
Я почти уверен, что сам код библиотеки в порядке (он протестирован и хорошо работает как на osx, так и на ios), но существует некоторый конфликт между использованием CoreAudio и «что-то в GUI».

Вот частичный след зависшего процесса:

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

Есть идеи что не так?

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()
0

Другие решения


По вопросам рекламы [email protected]