Writer
ffpyplayer.writer
FFmpeg based media writer
A FFmpeg based python media writer. See MediaWriter
for details.
Currently writes only video.
- class ffpyplayer.writer.MediaWriter
Bases:
object
An FFmpeg based media writer class. Currently only supports video.
With this class one can write images frames stored in many different pixel formats into a multi-stream video file using
write_frame()
. All FFmpeg codecs and pixel formats are supported.- Parameters:
- filename: str
The filename of the media file to create. Will be encoded using utf8 berfore passing to FFmpeg.
- streams: list of dicts
A list of streams to create in the file.
streams
is a list of dicts, where each dict configures the corresponding stream. The keywords listed below are available. One can also specify default values for the keywords for all streams usingkwargs
. Keywords also found instreams
will overwrite those inkwargs
:- pix_fmt_in: str
The pixel format of the
Image
to be passed towrite_frame()
for this stream. Can be one offfpyplayer.tools.pix_fmts
.- width_in: int
The width of the
ffpyplayer.pic.Image
that will be passed towrite_frame()
for this stream.- height_in: int
The height of the
ffpyplayer.pic.Image
that will be passed towrite_frame()
for this stream.- pix_fmt_out: str
The pixel format in which frames will be written to the file for this stream. Can be one of
ffpyplayer.tools.pix_fmts
. Defaults topix_fmt_in
if not provided. Not every pixel format is supported for each encoding codec, seeget_supported_pixfmts()
for which pixel formats are supported forcodec
.- width_out: int
The width at which frames will be written to the file for this stream. Defaults to
width_in
if not provided.- height_out: int
The height at which frames will be written to the file for this stream. Defaults to
height_in
if not provided.- codec: str
The codec used to write the frames to the file. Can be one of the encoding codecs in
ffpyplayer.tools.codecs_enc
.If not provided, it defaults to the default best codec for the format provided in
fmt
or guessed from thefilename
. Seeffpyplayer.tools.get_format_codecs()
- frame_rate: 2-tuple of ints
A 2-tuple of ints representing the frame rate to be used when writing the file. The first element is the numerator, while the second is the denuminator of a ratio describing the rate. E.g. (2997, 100) describes 29.97 fps.
The timestamps of the frames written using
write_frame()
do not necessarily need to be multiples of the frame rate because they might be forced to matching timestamps if required. Not every frame rate is supported for each encoding codec, seeffpyplayer.tools.get_supported_framerates()
for which frame rates are supported forcodec
.
- fmt: str
The format to use for the output. Can be one of
ffpyplayer.tools.formats_out
. Defaults to empty string. If not provided,filename
will be used determine the format, otherwise this arg will be used.- lib_opts: dict or list of dicts
A dictionary of options that will be passed to the ffmpeg libraries, codecs, sws, and formats when opening them. This accepts most of the options that can be passed to ffmpeg libraries. See below for examples. Both the keywords and values must be strings. It can be passed a dict in which case it’ll be applied to all the streams or a list containing a dict for each stream.
- metadata: dict or list of dicts
Metadata that will be written to the streams, if supported by the stream. See below for examples. Both the keywords and values must be strings. It can be passed a dict in which case it’ll be applied to all the streams or a list containing a dict for each stream. If (these) metadata is not supported, it will silently fail to write them.
- overwrite: bool
Whether we should overwrite an existing file. If False, an error will be raised if the file already exists. If True, the file will be overwritten if it exists.
- **kwargs:
Accepts default values for all
streams
which will be used if these keywords are not provided for any stream.
See Writing video to file and Compressing video to h264 for examples.
- close(self)
Closes the writer and writes any frames cached and not yet written.
Until called, or until the instance is deleted (and this is implicitly called) the file is not fully written.
Warning
After calling this method, calling any other class method on this instance may result in a crash or program corruption.
- get_configuration(self)
Returns the configuration parameters used to initialize all the streams for this instance.
This is not the same as the dicts passed when creating the file because this uses the actual parameters used.
- Returns:
list: List of dicts for each stream.
For example:
from ffpyplayer.writer import MediaWriter w, h = 640, 480 out_opts = {'pix_fmt_in':'rgb24', 'width_in':w, 'height_in':h, 'codec':'rawvideo', 'frame_rate':(5, 1)} writer = MediaWriter('output.avi', [out_opts] * 2, width_out=w/2, height_out=h/2) print writer.get_configuration() [{'height_in': 480, 'codec': 'rawvideo', 'width_in': 640, 'frame_rate': (5, 1), 'pix_fmt_in': 'rgb24', 'width_out': 320, 'height_out': 240, 'pix_fmt_out': 'rgb24'}, {'height_in': 480, 'codec': 'rawvideo', 'width_in': 640, 'frame_rate': (5, 1), 'pix_fmt_in': 'rgb24', 'width_out': 320, 'height_out': 240, 'pix_fmt_out': 'rgb24'}]
- write_frame(self, Image img, double pts, int stream=0)
Writes a
ffpyplayer.pic.Image
frame to the specified stream.If the input data is different than the frame written to disk in either size or pixel format as specified when creating the stream, the frame is converted before writing. But the input image must match the size and format as that specified when creating this stream.
- Parameters:
- img:
ffpyplayer.pic.Image
The
ffpyplayer.pic.Image
instance containing the frame to be written to disk.- pts: float
The timestamp of this frame in video time. E.g. 0.5 means the frame should be displayed by a player at 0.5 seconds after the video started playing. In a sense, the frame rate defines which timestamps are valid timestamps. However, this is not always the case, so if timestamps are invalid for a particular format, they are forced to valid values, if possible.
- stream: int
The stream number to which to write this frame. Defaults to 0.
- img:
- Returns:
(int): The approximate number of bytes written to disk so far for this file.
Note
This is not the same as the number of bytes passed to this function so far, because the encoders cache data before writing to disk. So although some frames may have been passed, the return value may not represent this.
An extreme example is where the same frame is passed many times to h264; the encoder will only write this frame once when the Writer object is closed and encoders are flushed, so this function will only return 0.
See Examples for its usage.