-
Notifications
You must be signed in to change notification settings - Fork 40
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unreliable capture of pythreejs with ImageRecorder on Safari #93
Comments
I can actually reproduce this problem with just an import ipywebrtc, ipywidgets
slider = ipywidgets.IntSlider()
slider
#------------------------------------
class ScreenshotWriter():
def __init__(self, widget):
stream = ipywebrtc.WidgetStream(widget=widget)
self.rec = ipywebrtc.ImageRecorder(format='png', stream=stream)
self._i = 0
self.rec.image.observe(self._imageUpdated, names='value')
def _imageUpdated(self, change):
if (self.rec.image.value):
self.rec.save(f'screenshot{self._i}.png')
self._i += 1
self.rec.image.value = b''
def capture(self):
self.rec.recording = True
w = ScreenshotWriter(slider)
#------------------------------------
w.capture()
#------------------------------------
w.rec.recording # after running the above cell a few times, this gets stuck at `True` Capture seems slightly more reliable for the slider, but after writing a few images, eventually |
Strangely after updating to Safari 14.0 (from 13.1.2), now the |
I am trying to capture an image of a pythreejs renderer using
ImageRecorder
. This works reliably on Chrome but not on Safari. I seem to be hitting a weird race condition, but I do not understand the asynchronous Javascript code involved well enough to figure what is going wrong.Here is an example demonstrating the problem:
(Comments delimit notebook cells.)
I expect
rec.recording = True
to (a) rerender the scene, (b) capture and save an image, and (c) resetrec.recording
toFalse
. This all happens reliably on Chrome, but (b) and (c) almost always fail on Safari (no image is written, andrec.recording
is stillTrue
at the end). Manually triggering a second redraw (e.g., by orbiting the view) usually causes (b) and (c) to finally happen.As best I can tell,
ImageRecorder
'ssnapshot
function hangs on theonCanPlay
call. It appears the redraw requested by pythreejs here is somehow happening "too soon," but I don't understand what order everything needs to happen in.This is tricky to debug since the capture starts working more (but not 100%) reliably when I insert breakpoints, e.g. here and here.
Do you have any ideas what might be wrong or suggestions on how to debug this?
The text was updated successfully, but these errors were encountered: