Package: psychopy Version: 1.77.02.dfsg-1 Severity: normal Hi,
using movie stimuli in Psychopy doesn't really work smoothly. Whenever a movie with sound is played I experience dropped frames. I am attaching a little benchmark that can be used to show this (done in the builder, just select a movie file and run it). This issue is only present when sound is actually played. When it is not played, even when a sound stream is present in the file and avbin just 'ignores' it, the stimulus is smooth. All files and codec combinations I tested play smooth in avplay, vlc, mplayer and others. I see this issue on amd64 and i386 -- independent of whether Psychopys own system check reports 'dropped frames' on a particular system or not. I tested Debian Jessie and Ubuntu 13.04, both show the problem. Psychopy upstream recommends avbin 5 for movie stimuli, but Debian never had it (according to snapshots.d.o). Psychopy upstream also recommend uncompressed PCM audio -- that makes no difference in comparison to, e.g. FLAC. Interestingly, I see a similar jerky playback in openshot. However, when using the MELT player (from the framework that openshot is based on) everything is smooth. This is also not an obvious IO issue. Even if I cache the entire movie file in memory, the frame drops are still present. System load at playback is negligible. Any advise would be very much appreciated. Thanks, Michael -- System Information: Debian Release: jessie/sid APT prefers testing APT policy: (650, 'testing'), (600, 'unstable') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 3.10-3-amd64 (SMP w/4 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages psychopy depends on: ii python 2.7.5-5 ii python-configobj 4.7.2+ds-5 ii python-lxml 3.2.0-1+b1 ii python-matplotlib 1.1.1~rc2-1 ii python-numpy 1:1.7.1-3 ii python-opengl 3.0.1-1 ii python-pygame 1.9.1release+dfsg-8 ii python-pyglet 1.1.4.dfsg-2 ii python-scipy 0.12.0-2+b1 ii python-support 1.0.15 Versions of packages psychopy recommends: ii ipython 0.13.2-2 ii libavbin0 7-1.4 ii libxxf86vm1 1:1.1.3-1 ii python-imaging 1.1.7-4 ii python-openpyxl 1.5.8-1 ii python-pygame 1.9.1release+dfsg-8 ii python-pyglet 1.1.4.dfsg-2 ii python-pyo 0.6.8-1 ii python-serial 2.6-1 ii python-wxgtk2.8 2.8.12.1+dfsg-1 Versions of packages psychopy suggests: pn python-iolabs <none> pn python-pyxid <none> -- debconf-show failed
<PsychoPy2experiment version="1.77.01" encoding="utf-8"> <Settings> <Param name="Show mouse" val="False" valType="bool" updates="None"/> <Param name="Save csv file" val="False" valType="bool" updates="None"/> <Param name="Monitor" val="testMonitor" valType="str" updates="None"/> <Param name="Enable Escape" val="True" valType="bool" updates="None"/> <Param name="color" val="$[0,0,0]" valType="str" updates="None"/> <Param name="Window size (pixels)" val="[1024, 768]" valType="code" updates="None"/> <Param name="Full-screen window" val="False" valType="bool" updates="None"/> <Param name="colorSpace" val="rgb" valType="str" updates="None"/> <Param name="Save log file" val="True" valType="bool" updates="None"/> <Param name="Experiment info" val="{u'session': u'001', u'participant': u''}" valType="code" updates="None"/> <Param name="Save excel file" val="False" valType="bool" updates="None"/> <Param name="Save wide csv file" val="True" valType="bool" updates="None"/> <Param name="Save psydat file" val="True" valType="bool" updates="None"/> <Param name="expName" val="movie_benchmark" valType="str" updates="None"/> <Param name="logging level" val="exp" valType="code" updates="None"/> <Param name="Units" val="use prefs" valType="str" updates="None"/> <Param name="Show info dlg" val="True" valType="bool" updates="None"/> <Param name="Saved data folder" val="" valType="code" updates="None"/> <Param name="Screen" val="1" valType="num" updates="None"/> </Settings> <Routines> <Routine name="movie_routine"> <MovieComponent name="movie_clip"> <Param name="opacity" val="1" valType="code" updates="constant"/> <Param name="name" val="movie_clip" valType="code" updates="constant"/> <Param name="movie" val="fg_av_test.mov" valType="str" updates="constant"/> <Param name="stopVal" val="10" valType="code" updates="constant"/> <Param name="durationEstim" val="" valType="code" updates="None"/> <Param name="pos" val="[0, 0]" valType="code" updates="constant"/> <Param name="forceEndRoutine" val="False" valType="bool" updates="constant"/> <Param name="startEstim" val="" valType="code" updates="None"/> <Param name="units" val="from exp settings" valType="str" updates="None"/> <Param name="startType" val="time (s)" valType="str" updates="None"/> <Param name="ori" val="0" valType="code" updates="constant"/> <Param name="stopType" val="duration (s)" valType="str" updates="None"/> <Param name="startVal" val="0.0" valType="code" updates="None"/> <Param name="size" val="" valType="code" updates="constant"/> </MovieComponent> <CodeComponent name="code"> <Param name="Begin Experiment" val="from datetime import datetime import numpy as np" valType="code" updates="constant"/> <Param name="name" val="code" valType="code" updates="None"/> <Param name="Each Frame" val="cur_movietime = movie_clip._movie._last_video_timestamp if last_movietime and cur_movietime > last_movietime: n_movieframes += 1 incr = cur_movietime - last_movietime movie_frame_increments.append(incr) movie_lags.append(cur_movietime - t) if lastframe_time: realtime_frame_increments.append(t - lastframe_time) lastframe_time = t last_movietime = cur_movietime" valType="code" updates="constant"/> <Param name="Begin Routine" val="n_movieframes = 0 last_movietime = None lastframe_time = None movie_frame_increments = [] realtime_frame_increments = [] movie_lags = []" valType="code" updates="constant"/> <Param name="End Routine" val="" valType="code" updates="constant"/> <Param name="End Experiment" val="import pylab as pl pl.subplot(1,2,1) pl.hist(realtime_frame_increments, bins=100) pl.title('Distance of two movie frames in real time') pl.xlabel('Time in secs') pl.subplot(1,2,2) pl.hist(movie_lags, bins=100) pl.title('Lag between movie time and real time for all frames') pl.xlabel('Time in seconds') print "Movie frames played:", n_movieframes print 'Mean movie frame increment:', np.mean(movie_frame_increments), 's (', 1./np.mean(movie_frame_increments), 'fps )' print 'Unique movie frame increments', np.unique(movie_frame_increments) pl.show()" valType="code" updates="constant"/> </CodeComponent> </Routine> </Routines> <Flow> <Routine name="movie_routine"/> </Flow> </PsychoPy2experiment>