All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
0.12.0 - 2026-05-25
plugins.rawdata_pillow- added pillow plugin to convert video/image stream to/from Pillow Image object
capsto cache the outputs of its functions
- FFmpeg v8 and v8.1 compatibility
- FFmpeg version may start with 'n' to support a version name with a release branch name
capssubpackage - fixed several bugsplugins.finder_ffdl- fixed logic to check existence of ffmpeg binaries
0.11.1 - 2025-05-17
audio.filter()andimage.filter(): fixed to process theirsp_kwargsargument- numPy plugin: fixed to convert the array view to bytes (fixes
stdinoperations in Linux) probe: fixed to accept any stringifiable object as url also cleaned up the url processing
0.11.0 - 2024-12-22
- allow writers'
extra_inputsarguments to bestrortuple[str, dict|None] probefunctions accepts PathLike object as the media url
configure.add_urls()to handleextra_inputsargument processing
probe._exec()to decode the error message sent from ffprobefiltergraph.Filter.add_labels(): fixed a syntax error
0.10.0 - 2024-07-03
capssubmodule - update format regex for v7 compatibilityfilterfunctions acceptexpr=Nonefor implicit filters (e.g., reshape and resample)probe.video/audio_stream_basic(): added keep_str_values bool argprobe._items_to_numeric(): not convert hex valuesprobe: added custom audio & video info probe functions - added_audio_info()and_video_info()audio.read()&SimpleAudioReader: switched to use_audio_info()image.read()video.read(), &SimpleVideoReader: switched to use_video_info()probe:urlargument to support bytes-like objectprobe._items_to_numeric(): added to convert hex int and a:b ratio fractionprobe:_add_select_streams: convert stream spec to str (if int)probe: addedkeep_str_valuesargument to ffprobe calling functionsprobe: addedkeep_optional_fieldsargument to ffprobe calling functionsprobe: addedsp_kwargsargument to all ffprobe running functionsprobe: addedframes()to__all__open(): major changes in input argumentsFilterclasses: Renamed constructor argumentsLoggerThread: pass ffmpeg logs to debug logopen(): no longer a context managerPopen.send_signal: defaults to perform ctrl-cSimpleReaderBase.close: poll before calling terminate
AviMediaReader: fixed Issue #46 - a bug inAviReaderThread.waitAviMediaReader: fixed__next__behavior (now throwsStopIteration)AviReaderThread: fixed buffer concatenation bugcompose_filter_args: fixed escaping commasprobe._resolve_entries(): fixed return valueprobe.query: fixed stream request idprobe: fixedcache_output=Trueoperationprobe.query(): fixed a logic to return a single streamprobe:_add_show_entries: fixed error if entries is boolPopen: fixedprogmon's cancel operation (ctrl-c)ProgressMonitorThread: call cancelfun() only once
probe: removed auto-caching ffprobe output
0.9.1 - 2024-02-19
util.parser.compose: fixed a bug composing FFmpeg arguments with an option with different values to two or more streamstreams.SimpleStreams.close: prevent OSError even if pipes to ffmpeg process fail to closethreading.LoggerThread.run: fixed to running logger thread when stderr not availableopento convert unused rate argument to ffmpeg option
0.9.0 - 2023-12-08
- No longer uses root logger. Creates and uses
"ffmpegio"logger - Tweaked to be compatible with FFmpeg v6.1
- Updated handling of repeated option values (overall + per-stream) so that per-stream value gets preference
0.8.6 - 2023-11-29
probe.query: return only the requested fields when retrieving from a cached resultfiltergraph: can be imported even if ffmpeg executable is not present
path.ffmpeg&path.ffprobe: throwFFmpegNotFoundif the executable not found
0.8.5 - 2023-11-13
probe.query: return a list of info of multiple streams if stream index is not specifiedprobe.query: sped up querying specific fields (avoids full query)probe.query: no longer errors if a field is invalid
0.8.4 - 2023-11-07
transcode()can output tostdout
- Fixed
show_loghandling in many functions
- Dropped support for Python 3.7 but added 3.12
- Dropped setup.py. All setup metadata in
pyproject.toml
0.8.3 - 2023-03-19
- SimpleStream writer/filter removed byte-casting of input buffer
0.8.2 - 2023-03-19
plugins.rawdata_bytescasting'buffers'asmemoryviewhas erroneous effect; now assume to receivebytes/bytearray
0.8.1 - 2023-03-18
- default plugins to return
Noneif not compatible analyze.BlurDetect.logchecknamenotkey
0.8.0 - 2022-10-29
filtergraphsubmodule for building complex filtergraphsutils.parser.compose()- support dict value for-metadataoutput optionsp_kwargsargument to all theread,write, andfilterfunctions and classes.
-
SimpleStreams.SimpleReaderBase.readinto()- fixed plugin invocation bug -
added missing
show_logargument toimage.filter() -
filtergraphmodule withFilter,Chain, andGraphclasses as FFmpeg filtergraph construction and manipulation tools -
ffmpeg_verfor easy access to linked FFmpeg version -
FFmpegioErrorexception class -
utils.is_stream_spec: new optionfile_index=Noneto search with or without filter index
- consolidate representation of input/output/internal links for filtergraphs, affecting
util.filter.parse_graph()&util.filter.compose_graph() - corrected function names
util.*spec_streamtoutil.*stream_spec caps.filters()outputsFilterSummarynamed tuplecaps.filter_info()outputsFilterInfonamed tuplecaps.filter_info()outputs'inputsandoutputsfields returns None if dynamic and [] if nonecaps.filters()outputs'num_inputsandnum_outputsfields returns None if dynamic and 0 if noneFilterGraphclass is now redirected to the newfiltergraph.Graph- improved
audio.create(),image.create(), andvideo.create() configure.build_basic_vf()to usefiltergraph.Graphand can be appended to user specifiedvfanalyzemodule, updated to usefiltergraph.Graphanalyze.MetadataLogger: changedfilter_specproperty tofilterto return aFilterobject- moved
utils.errormodule toerrors path.where()to raiseFFmpegNotFound
caps.filters()- fixed reporting incorrect # of pads for source and sink filtersutils.parse_stream_spec()- fixed file_index handlingutils.parse_stream_spec()- fixed pid stream (#) regexutils.filter- fixed filter and filtergraph parsing bugs
0.7.0 - 2022-08-24
analysismodule to extract the frame metadata set by video/audio analysis filtersvideo.detect()&audio.detect()to run the preset analysesextra_inputsargument toaudio.write,image.write,video.write, andSimpleWriterBaseconstructor to support extra source urlspath.check_version()to check FFmpeg version easily
util.concat: MovedFFConcat.optionstoFFConcat.File. RemovedFFConcat.add_option()andFFConcat.add_options()
0.6.0 - 2022-08-13
- Support for
gray10le,gray12le, andgray14lepixel formats ffmpegio.FFConcat.add_glob()method
SimpleReaderBase.read()to return None if no frames remains
- BUG:
SimpleWriterBase.__next__()returns empty frame at the eof - BUG:
SimpleVideoReaderandSimpleAudioReaderoverwrites user specified options - BUG:
SimpleWriterBasefails to capture all the FFmpeg log lines
0.5.2 - 2022-06-18
- video writers hanging when a basic filter to remove alpha channel is used
SimpleOutputStreams output rates are now explicitly matched to input rates by default
0.5.1 - 2022-04-21
open()handling of write mode
probeoutputs Fraction for compatible entries
transcode()allowed to take multiple inputs or outputs
0.5.0 - 2022-04-03
ffmpegio.ffmpegandffmpegio.ffprobefunctions to callffmpeg&ffprobe, respectively, without any input argument processingdevicessubmodule to provide a framework to enumerate I/O devices- New
pluginshooks:device_source_apianddevice_sink_api plugins/devices/dshowto support Windows' DirectShow device (-f dshow)FFConcatclass to support-f concatdemuxer andffconcatauto-scriptingprobe.framesto retrieve frame information
- Fixed failed
import ffmpegiowhen it cannot find FFmpeg binaries - Many minor bugs
- Uses
-hwaccel autoas default for all inputs (experiment) - Renamed
ffmpegmodule topath - Refactored
probe.py
0.4.3 - 2022-03-02
- Fixed
path.find(ffmpeg_dir)call
- Renamed
path.get_ffmpegtopath.where; original,path.wheredropped
0.4.2 - 2022-02-27
- Fixed import failure if FFmpeg is not found in the system
- Improved FFmpeg error reporting with
FFmpegErrorexception capsfunctions nwo throwFFmpegErrorexceptions- FFmpeg is called with
-nostdinflag by default
ffmpegio.ffmpegprocess.FLAGalias forNoneto make flag options more readable inffmpeg_argsdict
0.4.1 - 2022-02-22
- Fixed
capsffmpegcalls to print the banner
0.4.0 - 2022-02-22
finderplugin hook to allow custom automatic detection of ffmpeg executables
- Major refactoring of supporting modules, including new
_utilsandpathmodules
-n(no overwrite) global option is now used by default. Not having this caused the subprocess to hang, waiting for user input.
0.3.3 - 2022-02-17
- Fixed
pix_fmtandpix_fmt_incheck intranscodefunction
0.3.2 - 2022-02-17
- Fixed option handling bugs in
mediareaders
- All readers to support
lavfisource filter inputs
0.3.1 - 2022-02-15
- Output
imagedimension (v0.3.0 introduced a bug to return image as video frames)
bytes_to_videoandbytes_to_audioplugin hooks to take additional argumentsqueeze
0.3.0 - 2022-02-13
- Python distribution package name from
ffmpegiotoffmpegio-core - All raw data I/O operations are performed without NumPy array (NumPy support
has been spun off to
python-ffmpegio-numpyrepo) audio.create()to return sampling rate and samplesffmpegprocess.run()to return itsstdoutoutput asbytes- Updated AVI processing
- Cleaned up
SimpleStreams.py - All stream classes returns
rateorrate_in(instead ofsample_rateorframe_rate)
- Introduced plugin system (depending on
pluggypackage)
- Removed acknowledging planar PCM
sample_fmt's
0.2.1 - 2022-02-01
- added 'rvv' & 'raa' open modes
- added secret bool option "_force_basic_vf"
- fixed: added media module to the root module
- fixed: exec() no longer sets stdin & stdout when unspecified
- fixed parse() handling of help options
- ffmpeg.exec() capture_log option: None = console display, False = DEVNULL
0.2.0 - 2022-01-30
- added media.read()
- added streams.SimpleStreams.SimpleFilterBase
- added streams.SimpleStreams.SimpleAudioFilter
- added streams.SimpleStreams.SimpleVideoFilter
- added streams.AviStreams.AviMediaReader
- added 'vaf' and 'f' mode support for open()
- added ffmpegprocess.run_two_pass() for 2-pass encoding
- added 'two_pass', 'pass1_omits' and 'pass1_extras' arguments to video.write() and transcode()
- added threading.ReaderThread
- moved and renamed ffmpeg.ProgressMonitor to threading.ProgressMonitorThread
- moved and renamed utils.log.Logger to threading.LoggerThread
- changed writer argument names
- removed io.py and its dependencies
0.1.3 - 2022-01-26
square_pixelsoptions to video & imageoverwriteoption to video and image stream writersffmpegprocess.Popento resolve misplaced global options
0.1.2 - 2022-01-23
- Added basic video filter options, incl. special handling of
soutput argument and autoconversion from transparent to opaquepix_fmtwithfill_color - Added
overwriteargument to writer functions/classes ffmpegprocesssubmodule transportsPIPEandDEVNULLfromsubprocess
audio.createaframeargument replaced witht_inshow_logargument displays the log at the end even if log is captured- Renamed
caps.pixfmts()andcaps.samplefmts()topix_fmts()andsample_fmts(), respectively - Split
caps.coders()tocaps.decoders()andcaps.encoders() - Several output dict key names changed in
capsfunctions
- Removed
progressargument from all functions inimagesubmodule - Removed
utils.is_forced()
- Fixed
caps._getCodecInfoparsing issues
0.1.1 - 2022-01-21
- This file CHANGELOG
SimpleStreams.SimpleReaderBase.blocksizeproperty to specify the number of blocks of media data to read as iterator
- Turned
SimpleStreams.SimpleReaderBase.readiter()into__iter__()and__next__()to make the class Iterable - Moved Github repo from
tikuma-lsuhsctopython-ffmpegio
- Exception handling in
transcode.transcode()
0.1.0 - 2022-01-20
- First beta release.
- Main functionality of
transcode,video,audio,image,SimpleStreams,probe, andcapsmodules. - Preliminary implementations of
FilterGraphandFFmpegErrorclasses.