I guess this is hardware independent? (i.e. you have tried on few
boxes/laptops with the same success)
have you asked PsychoPy guys themselves?
O mighty Mario, would you happen to have ideas where to look at?
On Fri, 29 Nov 2013, Michael Hanke wrote:
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>