Shady.Video Sub-module
This submodule is not imported by default by the parent package.
Import it for its side-effect: it enables the video property
of the Shady.Stimulus class.
If s is a Stimulus instance and s.video is equal to its
default value of None, then saying:
s.video = 'fish.mp4'
implicitly creates a VideoSource object with the source
property equal to 'fish.mp4'. (If s.video was previously
already a VideoSource, object then its source property is
simply updated accordingly.)
The third-party package cv2 (installable with
pip install opencv-python) is required for video support.
Any source readable by cv2.VideoCapture is acceptable:
use an integer to open a live camera stream, or a string to
specify a video file name.
If you want to record the video to disk while rendering, there
are two approaches. One way is to capture frames in a way that
is time- (or frame-) locked to the animation of the World:
in this case, see the doc for the VideoRecording class, which
can capture the content of any Stimulus regardless of
whether its source is a VideoSource, or even capture an entire
World. The other way is to record a VideoSource that is
already attached to a Stimulus, sub-sampling frames at an
independent pace in a background thread: in this case, simply
call s.video.Record(filename).
If you want to record a video to disk without attaching it to
a Shady.Stimulus, or even without having a Shady.World
running at all. Let’s say you want to record from camera 0:
from Shady.Video import VideoSource
s = VideoSource(0).Record('foo')
# ...
s.Close()
An acquisition thread will continually read frames from the
camera until you call s.Close(). A separate recording thread
will continually write frames to the specified file (foo.avi
in this example) until you call either s.Close() or
s.StopRecording().
Note that reading frames from a camera or file, capturing stimulus content into memory, and recording video frames to disk all use RAM and place a burden on the CPU—they are not intended for applications in which precise timing is critical.