Module code >> skvideo.io.io
Fork me on GitHub

Source code for skvideo.io.io

import numpy as np

from .avconv import LibAVReader
from .avconv import LibAVWriter
from .ffmpeg import FFmpegReader
from .ffmpeg import FFmpegWriter
from .. import _HAS_AVCONV
from .. import _HAS_FFMPEG
from ..utils import *


[docs]def vwrite(fname, videodata, inputdict=None, outputdict=None, backend='ffmpeg', verbosity=0): """Save a video to file entirely from memory. Parameters ---------- fname : string Video file name. videodata : ndarray ndarray of dimension (T, M, N, C), (T, M, N), (M, N, C), or (M, N), where T is the number of frames, M is the height, N is width, and C is number of channels. inputdict : dict Input dictionary parameters, i.e. how to interpret the piped datastream coming from python to the subprocess. outputdict : dict Output dictionary parameters, i.e. how to encode the data to disk. backend : string Program to use for handling video data. Only 'ffmpeg' and 'libav' are supported at this time. verbosity : int Setting to 0 (default) disables all debugging output. Setting to 1 enables all debugging output. Useful to see if the backend is behaving properly. Returns ------- none """ if not inputdict: inputdict = {} if not outputdict: outputdict = {} videodata = vshape(videodata) # check that the appropriate videodata size was passed T, M, N, C = videodata.shape if backend == "ffmpeg": # check if FFMPEG exists in the path assert _HAS_FFMPEG, "Cannot find installation of real FFmpeg (which comes with ffprobe)." writer = FFmpegWriter(fname, inputdict=inputdict, outputdict=outputdict, verbosity=verbosity) for t in range(T): writer.writeFrame(videodata[t]) writer.close() elif backend == "libav": # check if FFMPEG exists in the path assert _HAS_AVCONV, "Cannot find installation of libav." writer = LibAVWriter(fname, inputdict=inputdict, outputdict=outputdict, verbosity=verbosity) for t in range(T): writer.writeFrame(videodata[t]) writer.close() else: raise NotImplemented
[docs]def vread(fname, height=0, width=0, num_frames=0, as_grey=False, inputdict=None, outputdict=None, backend='ffmpeg', verbosity=0): """Load a video from file entirely into memory. Parameters ---------- fname : string Video file name, e.g. ``bickbuckbunny.mp4`` height : int Set the source video height used for decoding. Useful for raw inputs when video header does not exist. width : int Set the source video width used for decoding. Useful for raw inputs when video header does not exist. num_frames : int Only read the first `num_frames` number of frames from video. Setting `num_frames` to small numbers can significantly speed up video loading times. as_grey : bool If true, only load the luminance channel of the input video. inputdict : dict Input dictionary parameters, i.e. how to interpret the input file. outputdict : dict Output dictionary parameters, i.e. how to encode the data when sending back to the python process. backend : string Program to use for handling video data. Only 'ffmpeg' and 'libav' are supported at this time. verbosity : int Setting to 0 (default) disables all debugging output. Setting to 1 enables all debugging output. Useful to see if the backend is behaving properly. Returns ------- vid_array : ndarray ndarray of dimension (T, M, N, C), where T is the number of frames, M is the height, N is width, and C is depth. """ if not inputdict: inputdict = {} if not outputdict: outputdict = {} if backend == "ffmpeg": # check if FFMPEG exists in the path assert _HAS_FFMPEG, "Cannot find installation of real FFmpeg (which comes with ffprobe)." if ((height != 0) and (width != 0)): inputdict['-s'] = str(width) + 'x' + str(height) if num_frames != 0: outputdict['-vframes'] = str(num_frames) if as_grey: outputdict['-pix_fmt'] = 'gray' reader = FFmpegReader(fname, inputdict=inputdict, outputdict=outputdict, verbosity=verbosity) T, M, N, C = reader.getShape() videodata = np.empty((T, M, N, C), dtype=reader.dtype) for idx, frame in enumerate(reader.nextFrame()): videodata[idx, :, :, :] = frame if as_grey: videodata = vshape(videodata[:, :, :, 0]) reader.close() return videodata elif backend == "libav": # check if FFMPEG exists in the path assert _HAS_AVCONV, "Cannot find installation of libav." if ((height != 0) and (width != 0)): inputdict['-s'] = str(width) + 'x' + str(height) if num_frames != 0: outputdict['-vframes'] = str(num_frames) reader = LibAVReader(fname, inputdict=inputdict, outputdict=outputdict, verbosity=verbosity) T, M, N, C = reader.getShape() videodata = np.empty((T, M, N, C), dtype=reader.dtype) for idx, frame in enumerate(reader.nextFrame()): videodata[idx, :, :, :] = frame reader.close() return videodata else: raise NotImplemented
[docs]def vreader(fname, height=0, width=0, num_frames=0, as_grey=False, inputdict=None, outputdict=None, backend='ffmpeg', verbosity=0): """Load a video through the use of a generator. Parameters ---------- fname : string Video file name, e.g. ``bickbuckbunny.mp4`` height : int Set the source video height used for decoding. Useful for raw inputs when video header does not exist. width : int Set the source video width used for decoding. Useful for raw inputs when video header does not exist. num_frames : int Only read the first `num_frames` number of frames from video. Setting `num_frames` to small numbers can significantly speed up video loading times. as_grey : bool If true, only load the luminance channel of the input video. inputdict : dict Input dictionary parameters, i.e. how to interpret the input file. outputdict : dict Output dictionary parameters, i.e. how to encode the data between backend and python. backend : string Program to use for handling video data. Only 'ffmpeg' and 'libav' are supported at this time. verbosity : int Setting to 0 (default) disables all debugging output. Setting to 1 enables all debugging output. Useful to see if the backend is behaving properly. Returns ------- vid_gen : generator returns ndarrays, shape (M, N, C) where M is frame height, N is frame width, and C is number of channels per pixel ---------------- plugin_args : keywords Passed to the given plugin. """ if not inputdict: inputdict = {} if not outputdict: outputdict = {} if backend == "ffmpeg": # check if FFMPEG exists in the path assert _HAS_FFMPEG, "Cannot find installation of ffmpeg." if ((height != 0) and (width != 0)): inputdict['-s'] = str(width) + 'x' + str(height) if num_frames != 0: outputdict['-vframes'] = str(num_frames) if as_grey: outputdict['-pix_fmt'] = 'gray' reader = FFmpegReader(fname, inputdict=inputdict, outputdict=outputdict, verbosity=verbosity) try: for frame in reader.nextFrame(): if as_grey: yield vshape(frame[:, :, 0]) else: yield frame finally: reader.close() elif backend == "libav": # check if FFMPEG exists in the path assert _HAS_AVCONV, "Cannot find installation of libav." if ((height != 0) and (width != 0)): inputdict['-s'] = str(width) + 'x' + str(height) if num_frames != 0: outputdict['-vframes'] = str(num_frames) reader = LibAVReader(fname, inputdict=inputdict, outputdict=outputdict, verbosity=verbosity) try: for frame in reader.nextFrame(): yield frame finally: reader.close() else: raise NotImplemented