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

Source code for skvideo.io.ffmpeg

""" Plugin that uses ffmpeg to read and write series of images to
a wide range of video formats.

"""

# Heavily inspired from Almar Klein's imageio code
# Copyright (c) 2015, imageio contributors
# distributed under the terms of the BSD License (included in release).

import subprocess as sp

import numpy as np

from .abstract import VideoReaderAbstract, VideoWriterAbstract
from .ffprobe import ffprobe
from .. import _FFMPEG_APPLICATION
from .. import _FFMPEG_PATH
from .. import _FFMPEG_SUPPORTED_DECODERS
from .. import _FFMPEG_SUPPORTED_ENCODERS
from .. import _HAS_FFMPEG
from ..utils import *


# uses FFmpeg to read the given file with parameters
[docs]class FFmpegReader(VideoReaderAbstract): """Reads frames using FFmpeg Using FFmpeg as a backend, this class provides sane initializations meant to handle the default case well. """ INFO_AVERAGE_FRAMERATE = "@r_frame_rate" INFO_WIDTH = "@width" INFO_HEIGHT = "@height" INFO_PIX_FMT = "@pix_fmt" INFO_DURATION = "@duration" INFO_NB_FRAMES = "@nb_frames" OUTPUT_METHOD = "image2pipe"
[docs] def __init__(self, *args, **kwargs): assert _HAS_FFMPEG, "Cannot find installation of real FFmpeg (which comes with ffprobe)." super(FFmpegReader,self).__init__(*args, **kwargs)
def _createProcess(self, inputdict, outputdict, verbosity): if '-vcodec' not in outputdict: outputdict['-vcodec'] = "rawvideo" iargs = self._dict2Args(inputdict) oargs = self._dict2Args(outputdict) if verbosity > 0: cmd = [_FFMPEG_PATH + "/" + _FFMPEG_APPLICATION] + iargs + ['-i', self._filename] + oargs + ['-'] print(cmd) self._proc = sp.Popen(cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=None) else: cmd = [_FFMPEG_PATH + "/" + _FFMPEG_APPLICATION, "-nostats", "-loglevel", "0"] + iargs + ['-i', self._filename] + oargs + [ '-'] self._proc = sp.Popen(cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) self._cmd = " ".join(cmd) def _probCountFrames(self): # open process, grabbing number of frames using ffprobe probecmd = [_FFMPEG_PATH + "/ffprobe"] + ["-v", "error", "-count_frames", "-select_streams", "v:0", "-show_entries", "stream=nb_read_frames", "-of", "default=nokey=1:noprint_wrappers=1", self._filename] return np.int(check_output(probecmd).decode().split('\n')[0]) def _probe(self): return ffprobe(self._filename) def _getSupportedDecoders(self): return _FFMPEG_SUPPORTED_DECODERS
[docs]class FFmpegWriter(VideoWriterAbstract): """Writes frames using FFmpeg Using FFmpeg as a backend, this class provides sane initializations for the default case. """
[docs] def __init__(self, *args, **kwargs): assert _HAS_FFMPEG, "Cannot find installation of real FFmpeg (which comes with ffprobe)." super(FFmpegWriter,self).__init__(*args, **kwargs)
def _getSupportedEncoders(self): return _FFMPEG_SUPPORTED_ENCODERS def _createProcess(self, inputdict, outputdict, verbosity): iargs = self._dict2Args(inputdict) oargs = self._dict2Args(outputdict) cmd = [_FFMPEG_PATH + "/" + _FFMPEG_APPLICATION, "-y"] + iargs + ["-i", "-"] + oargs + [self._filename] self._cmd = " ".join(cmd) # Launch process if self.verbosity > 0: print(self._cmd) self._proc = sp.Popen(cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=None) else: self._proc = sp.Popen(cmd, stdin=sp.PIPE, stdout=self.DEVNULL, stderr=sp.STDOUT)