Name | ffmpegio JSON |
Version |
0.9.1
JSON |
| download |
home_page | |
Summary | Media I/O with FFmpeg and NumPy array |
upload_time | 2024-02-20 04:14:15 |
maintainer | |
docs_url | None |
author | |
requires_python | >=3.8 |
license | GPL-2.0 License |
keywords |
multimedia
ffmpeg
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
`ffmpegio`: Media I/O with FFmpeg in Python (with NumPy Array Plugin)
=====================================================================
|pypi| |pypi-status| |pypi-pyvers| |github-license| |github-status|
.. |pypi| image:: https://img.shields.io/pypi/v/ffmpegio
:alt: PyPI
.. |pypi-status| image:: https://img.shields.io/pypi/status/ffmpegio
:alt: PyPI - Status
.. |pypi-pyvers| image:: https://img.shields.io/pypi/pyversions/ffmpegio
:alt: PyPI - Python Version
.. |github-license| image:: https://img.shields.io/github/license/python-ffmpegio/python-ffmpegio
:alt: GitHub License
.. |github-status| image:: https://img.shields.io/github/workflow/status/python-ffmpegio/python-ffmpegio/Run%20Tests
:alt: GitHub Workflow Status
Python `ffmpegio` package aims to bring the full capability of `FFmpeg <https://ffmpeg.org>`__
to read, write, probe, and manipulate multimedia data to Python. FFmpeg is an open-source cross-platform
multimedia framework, which can handle most of the multimedia formats available today.
.. note::
Since v0.3.0, `ffmpegio` Python distribution package has been split into `ffmpegio-core` and `ffmpegio` to allow
Numpy-independent installation.
Install the full `ffmpegio` package via ``pip``:
.. code-block:: bash
pip install ffmpegio
If `numpy.ndarray` data I/O is not needed, instead use
.. code-block:: bash
pip install ffmpegio-core
Main Features
-------------
* Pure-Python light-weight package interacting with FFmpeg executable found in
the system
* Transcode a media file to another in Python
* Read, write, filter, and create functions for audio, image, and video data
* Context-managing `ffmpegio.open` to perform stream read/write operations of video and audio
* Automatically detect and convert audio & video formats to and from `numpy.ndarray` properties
* Probe media file information
* Accepts all FFmpeg options including filter graphs
* Supports a user callback whenever FFmpeg updates its progress information file
(see `-progress` FFmpeg option)
* `ffconcat` scripter to make the use of `-f concat` demuxer easier
* I/O device enumeration to eliminate the need to look up device names. (currently supports only: Windows DirectShow)
* More features to follow
Documentation
-------------
Visit our `GitHub page here <https://python-ffmpegio.github.io/python-ffmpegio/>`__
Examples
--------
To import `ffmpegio`
.. code-block:: python
>>> import ffmpegio
- `Transcoding <ex_trancode>`__
- `Read Audio Files <ex_read_audio>`__
- `Read Image Files / Capture Video Frames <ex_read_image>`__
- `Read Video Files <ex_read_video>`__
- `Read Multiple Files or Streams <ex_read_media>`__
- `Write Audio, Image, & Video Files <ex_write>`__
- `Filter Audio, Image, & Video Data <ex_filter>`__
- `Stream I/O <ex_stream>`__
- `Device I/O Enumeration <ex_devices>`__
- `Progress Callback <ex_progress>`__
- `Run FFmpeg and FFprobe Directly <ex_direct>`__
.. _ex_trancode:
Transcoding
^^^^^^^^^^^
.. code-block:: python
>>> # transcode, overwrite output file if exists, showing the FFmpeg log
>>> ffmpegio.transcode('input.avi', 'output.mp4', overwrite=True, show_log=True)
>>> # 1-pass H.264 transcoding
>>> ffmpegio.transcode('input.avi', 'output.mkv', vcodec='libx264', show_log=True,
>>> preset='slow', crf=22, acodec='copy')
>>> # 2-pass H.264 transcoding
>>> ffmpegio.transcode('input.avi', 'output.mkv', two_pass=True, show_log=True,
>>> **{'c:v':'libx264', 'b:v':'2600k', 'c:a':'aac', 'b:a':'128k'})
>>> # concatenate videos using concat demuxer
>>> files = ['/video/video1.mkv','/video/video2.mkv']
>>> ffconcat = ffmpegio.FFConcat()
>>> ffconcat.add_files(files)
>>> with ffconcat: # generates temporary ffconcat file
>>> ffmpegio.transcode(ffconcat, 'output.mkv', f_in='concat', codec='copy', safe_in=0)
.. _ex_read_audio:
Read Audio Files
^^^^^^^^^^^^^^^^
.. code-block:: python
>>> # read audio samples in its native sample format and return all channels
>>> fs, x = ffmpegio.audio.read('myaudio.wav')
>>> # fs: sampling rate in samples/second, x: [nsamples x nchannels] numpy array
>>> # read audio samples from 24.15 seconds to 63.2 seconds, pre-convert to mono in float data type
>>> fs, x = ffmpegio.audio.read('myaudio.flac', ss=24.15, to=63.2, sample_fmt='dbl', ac=1)
>>> # read filtered audio samples first 10 seconds
>>> # filter: equalizer which attenuate 10 dB at 1 kHz with a bandwidth of 200 Hz
>>> fs, x = ffmpegio.audio.read('myaudio.mp3', t=10.0, af='equalizer=f=1000:t=h:width=200:g=-10')
.. _ex_read_image:
Read Image Files / Capture Video Frames
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: python
>>> # list supported image extensions
>>> ffmpegio.caps.muxer_info('image2')['extensions']
['bmp', 'dpx', 'exr', 'jls', 'jpeg', 'jpg', 'ljpg', 'pam', 'pbm', 'pcx', 'pfm', 'pgm', 'pgmyuv',
'png', 'ppm', 'sgi', 'tga', 'tif', 'tiff', 'jp2', 'j2c', 'j2k', 'xwd', 'sun', 'ras', 'rs', 'im1',
'im8', 'im24', 'sunras', 'xbm', 'xface', 'pix', 'y']
>>> # read BMP image with auto-detected pixel format (rgb24, gray, rgba, or ya8)
>>> I = ffmpegio.image.read('myimage.bmp') # I: [height x width x ncomp] numpy array
>>> # read JPEG image, then convert to grayscale and proportionally scale so the width is 480 pixels
>>> I = ffmpegio.image.read('myimage.jpg', pix_fmt='grayscale', s='480x-1')
>>> # read PNG image with transparency, convert it to plain RGB by filling transparent pixels orange
>>> I = ffmpegio.image.read('myimage.png', pix_fmt='rgb24', fill_color='orange')
>>> # capture video frame at timestamp=4:25.3 and convert non-square pixels to square
>>> I = ffmpegio.image.read('myvideo.mpg', ss='4:25.3', square_pixels='upscale')
>>> # capture 5 video frames and tile them on 3x2 grid with 7px between them, and 2px of initial margin
>>> I = ffmpegio.image.read('myvideo.mp4', vf='tile=3x2:nb_frames=5:padding=7:margin=2')
>>> # create spectrogram of the audio input (must specify pix_fmt if input is audio)
>>> I = ffmpegio.image.read('myaudio.mp3', filter_complex='showspectrumpic=s=960x540', pix_fmt='rgb24')
.. _ex_read_video:
Read Video Files
^^^^^^^^^^^^^^^^
.. code-block:: python
>>> # read 50 video frames at t=00:32:40 then convert to grayscale
>>> fs, F = ffmpegio.video.read('myvideo.mp4', ss='00:32:40', vframes=50, pix_fmt='gray')
>>> # fs: frame rate in frames/second, F: [nframes x height x width x ncomp] numpy array
>>> # get running spectrogram of audio input (must specify pix_fmt if input is audio)
>>> fs, F = ffmpegio.video.read('myvideo.mp4', pix_fmt='rgb24', filter_complex='showspectrum=s=1280x480')
.. _ex_read_media:
Read Multiple Files or Streams
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: python
>>> # read both video and audio streams (1 ea)
>>> rates, data = ffmpegio.media.read('mymedia.mp4')
>>> # rates: dict of frame rate and sampling rate: keys="v:0" and "a:0"
>>> # data: dict of video frame array and audio sample array: keys="v:0" and "a:0"
>>> # combine video and audio files
>>> rates, data = ffmpegio.media.read('myvideo.mp4','myaudio.mp3')
>>> # get output of complex filtergraph (can take multiple inputs)
>>> expr = "[v:0]split=2[out0][l1];[l1]edgedetect[out1]"
>>> rates, data = ffmpegio.media.read('myvideo.mp4',filter_complex=expr,map=['[out0]','[out1]'])
>>> # rates: dict of frame rates: keys="v:0" and "v:1"
>>> # data: dict of video frame arrays: keys="v:0" and "v:1"
.. _ex_write:
Write Audio, Image, & Video Files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: python
>>> # create a video file from a numpy array
>>> ffmpegio.video.write('myvideo.mp4', rate, F)
>>> # create an image file from a numpy array
>>> ffmpegio.image.write('myimage.png', F)
>>> # create an audio file from a numpy array
>>> ffmpegio.audio.write('myaudio.mp3', rate, x)
.. _ex_filter:
Filter Audio, Image, & Video Data
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: python
>>> # Add fade-in and fade-out effects to audio data
>>> fs_out, y = ffmpegio.audio.filter('afade=t=in:ss=0:d=15,afade=t=out:st=875:d=25', fs_in, x)
>>> # Apply mirror effect to an image
>>> I_out = ffmpegio.image.filter('crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left][right] hstack', I_in)
>>> # Add text at the center of the video frame
>>> filter = "drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2"
>>> fs_out, F_out = ffmpegio.video.filter(filter, fs_in, F_in)
.. _ex_stream:
Stream I/O
^^^^^^^^^^
.. code-block:: python
>>> # process video 100 frames at a time and save output as a new video
>>> # with the same frame rate
>>> with ffmpegio.open('myvideo.mp4', 'rv', blocksize=100) as fin,
>>> ffmpegio.open('myoutput.mp4', 'wv', rate=fin.frame_rate) as fout:
>>> for frames in fin:
>>> fout.write(myprocess(frames))
.. _ex_devices:
Device I/O Enumeration
^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: python
>>> # record 5 minutes of audio from Windows microphone
>>> fs, x = ffmpegio.audio.read('a:0', f_in='dshow', sample_fmt='dbl', t=300)
>>> # capture Windows' webcam frame
>>> with ffmpegio.open('v:0', 'rv', f_in='dshow') as webcam,
>>> for frame in webcam:
>>> process_frame(frame)
.. _ex_progress:
Progress Callback
^^^^^^^^^^^^^^^^^
.. code-block:: python
>>> import pprint
>>> # progress callback
>>> def progress(info, done):
>>> pprint(info) # bunch of stats
>>> if done:
>>> print('video decoding completed')
>>> else:
>>> return check_cancel_command(): # return True to kill immediately
>>> # can be used in any butch processing
>>> rate, F = ffmpegio.video.read('myvideo.mp4', progress=progress)
>>> # as well as for stream processing
>>> with ffmpegio.open('myvideo.mp4', 'rv', blocksize=100, progress=progress) as fin:
>>> for frames in fin:
>>> myprocess(frames)
.. _ex_direct:
Run FFmpeg and FFprobe Directly
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: python
>>> from ffmpegio import ffmpeg, FFprobe, ffmpegprocess
>>> from subprocess import PIPE
>>> # call with options as a long string
>>> ffmpeg('-i input.avi -b:v 64k -bufsize 64k output.avi')
>>> # or call with list of options
>>> ffmpeg(['-i', 'input.avi' ,'-r', '24', 'output.avi'])
>>> # the same for ffprobe
>>> ffprobe('ffprobe -show_streams -select_streams a INPUT')
>>> # specify subprocess arguments to capture stdout
>>> out = ffprobe('ffprobe -of json -show_frames INPUT',
stdout=PIPE, universal_newlines=True).stdout
>>> # use ffmpegprocess to take advantage of ffmpegio's default behaviors
>>> out = ffmpegprocess.run({"inputs": [("input.avi", None)],
"outputs": [("out1.mp4", None),
("-", {"f": "rawvideo", "vframes": 1, "pix_fmt": "gray", "an": None})
}, capture_log=True)
>>> print(out.stderr) # print the captured FFmpeg logs (banner text omitted)
>>> b = out.stdout # width*height bytes of the first frame
Raw data
{
"_id": null,
"home_page": "",
"name": "ffmpegio",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "multimedia,ffmpeg",
"author": "",
"author_email": "",
"download_url": "https://files.pythonhosted.org/packages/bd/7f/89e11f2d34c78c40de5acf54dbdcea8ff04c3ff81848c367db8bc6885471/ffmpegio-0.9.1.tar.gz",
"platform": null,
"description": "`ffmpegio`: Media I/O with FFmpeg in Python (with NumPy Array Plugin)\n=====================================================================\n\n|pypi| |pypi-status| |pypi-pyvers| |github-license| |github-status|\n\n.. |pypi| image:: https://img.shields.io/pypi/v/ffmpegio\n :alt: PyPI\n.. |pypi-status| image:: https://img.shields.io/pypi/status/ffmpegio\n :alt: PyPI - Status\n.. |pypi-pyvers| image:: https://img.shields.io/pypi/pyversions/ffmpegio\n :alt: PyPI - Python Version\n.. |github-license| image:: https://img.shields.io/github/license/python-ffmpegio/python-ffmpegio\n :alt: GitHub License\n.. |github-status| image:: https://img.shields.io/github/workflow/status/python-ffmpegio/python-ffmpegio/Run%20Tests\n :alt: GitHub Workflow Status\n\nPython `ffmpegio` package aims to bring the full capability of `FFmpeg <https://ffmpeg.org>`__\nto read, write, probe, and manipulate multimedia data to Python. FFmpeg is an open-source cross-platform \nmultimedia framework, which can handle most of the multimedia formats available today.\n\n.. note::\n \n Since v0.3.0, `ffmpegio` Python distribution package has been split into `ffmpegio-core` and `ffmpegio` to allow\n Numpy-independent installation.\n\nInstall the full `ffmpegio` package via ``pip``:\n\n.. code-block:: bash\n\n pip install ffmpegio\n\nIf `numpy.ndarray` data I/O is not needed, instead use \n\n.. code-block:: bash\n\n pip install ffmpegio-core\n\nMain Features\n-------------\n\n* Pure-Python light-weight package interacting with FFmpeg executable found in \n the system\n* Transcode a media file to another in Python\n* Read, write, filter, and create functions for audio, image, and video data\n* Context-managing `ffmpegio.open` to perform stream read/write operations of video and audio\n* Automatically detect and convert audio & video formats to and from `numpy.ndarray` properties\n* Probe media file information\n* Accepts all FFmpeg options including filter graphs\n* Supports a user callback whenever FFmpeg updates its progress information file \n (see `-progress` FFmpeg option)\n* `ffconcat` scripter to make the use of `-f concat` demuxer easier\n* I/O device enumeration to eliminate the need to look up device names. (currently supports only: Windows DirectShow)\n* More features to follow\n\nDocumentation\n-------------\n\nVisit our `GitHub page here <https://python-ffmpegio.github.io/python-ffmpegio/>`__\n\nExamples\n--------\n\nTo import `ffmpegio`\n\n.. code-block:: python\n\n >>> import ffmpegio\n\n- `Transcoding <ex_trancode>`__\n- `Read Audio Files <ex_read_audio>`__\n- `Read Image Files / Capture Video Frames <ex_read_image>`__\n- `Read Video Files <ex_read_video>`__\n- `Read Multiple Files or Streams <ex_read_media>`__\n- `Write Audio, Image, & Video Files <ex_write>`__\n- `Filter Audio, Image, & Video Data <ex_filter>`__\n- `Stream I/O <ex_stream>`__\n- `Device I/O Enumeration <ex_devices>`__\n- `Progress Callback <ex_progress>`__\n- `Run FFmpeg and FFprobe Directly <ex_direct>`__\n\n.. _ex_trancode:\n\nTranscoding\n^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> # transcode, overwrite output file if exists, showing the FFmpeg log\n >>> ffmpegio.transcode('input.avi', 'output.mp4', overwrite=True, show_log=True) \n\n >>> # 1-pass H.264 transcoding\n >>> ffmpegio.transcode('input.avi', 'output.mkv', vcodec='libx264', show_log=True,\n >>> preset='slow', crf=22, acodec='copy') \n\n >>> # 2-pass H.264 transcoding\n >>> ffmpegio.transcode('input.avi', 'output.mkv', two_pass=True, show_log=True,\n >>> **{'c:v':'libx264', 'b:v':'2600k', 'c:a':'aac', 'b:a':'128k'}) \n\n >>> # concatenate videos using concat demuxer\n >>> files = ['/video/video1.mkv','/video/video2.mkv']\n >>> ffconcat = ffmpegio.FFConcat()\n >>> ffconcat.add_files(files)\n >>> with ffconcat: # generates temporary ffconcat file\n >>> ffmpegio.transcode(ffconcat, 'output.mkv', f_in='concat', codec='copy', safe_in=0)\n\n.. _ex_read_audio:\n\nRead Audio Files\n^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> # read audio samples in its native sample format and return all channels\n >>> fs, x = ffmpegio.audio.read('myaudio.wav') \n >>> # fs: sampling rate in samples/second, x: [nsamples x nchannels] numpy array\n\n >>> # read audio samples from 24.15 seconds to 63.2 seconds, pre-convert to mono in float data type \n >>> fs, x = ffmpegio.audio.read('myaudio.flac', ss=24.15, to=63.2, sample_fmt='dbl', ac=1)\n\n >>> # read filtered audio samples first 10 seconds\n >>> # filter: equalizer which attenuate 10 dB at 1 kHz with a bandwidth of 200 Hz \n >>> fs, x = ffmpegio.audio.read('myaudio.mp3', t=10.0, af='equalizer=f=1000:t=h:width=200:g=-10')\n\n.. _ex_read_image:\n\nRead Image Files / Capture Video Frames\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> # list supported image extensions\n >>> ffmpegio.caps.muxer_info('image2')['extensions']\n ['bmp', 'dpx', 'exr', 'jls', 'jpeg', 'jpg', 'ljpg', 'pam', 'pbm', 'pcx', 'pfm', 'pgm', 'pgmyuv', \n 'png', 'ppm', 'sgi', 'tga', 'tif', 'tiff', 'jp2', 'j2c', 'j2k', 'xwd', 'sun', 'ras', 'rs', 'im1', \n 'im8', 'im24', 'sunras', 'xbm', 'xface', 'pix', 'y']\n\n >>> # read BMP image with auto-detected pixel format (rgb24, gray, rgba, or ya8)\n >>> I = ffmpegio.image.read('myimage.bmp') # I: [height x width x ncomp] numpy array\n\n >>> # read JPEG image, then convert to grayscale and proportionally scale so the width is 480 pixels\n >>> I = ffmpegio.image.read('myimage.jpg', pix_fmt='grayscale', s='480x-1')\n\n >>> # read PNG image with transparency, convert it to plain RGB by filling transparent pixels orange\n >>> I = ffmpegio.image.read('myimage.png', pix_fmt='rgb24', fill_color='orange')\n\n >>> # capture video frame at timestamp=4:25.3 and convert non-square pixels to square\n >>> I = ffmpegio.image.read('myvideo.mpg', ss='4:25.3', square_pixels='upscale')\n\n >>> # capture 5 video frames and tile them on 3x2 grid with 7px between them, and 2px of initial margin\n >>> I = ffmpegio.image.read('myvideo.mp4', vf='tile=3x2:nb_frames=5:padding=7:margin=2')\n\n >>> # create spectrogram of the audio input (must specify pix_fmt if input is audio)\n >>> I = ffmpegio.image.read('myaudio.mp3', filter_complex='showspectrumpic=s=960x540', pix_fmt='rgb24')\n\n\n.. _ex_read_video:\n\nRead Video Files\n^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> # read 50 video frames at t=00:32:40 then convert to grayscale\n >>> fs, F = ffmpegio.video.read('myvideo.mp4', ss='00:32:40', vframes=50, pix_fmt='gray')\n >>> # fs: frame rate in frames/second, F: [nframes x height x width x ncomp] numpy array\n\n >>> # get running spectrogram of audio input (must specify pix_fmt if input is audio)\n >>> fs, F = ffmpegio.video.read('myvideo.mp4', pix_fmt='rgb24', filter_complex='showspectrum=s=1280x480')\n \n\n.. _ex_read_media:\n\nRead Multiple Files or Streams\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> # read both video and audio streams (1 ea)\n >>> rates, data = ffmpegio.media.read('mymedia.mp4')\n >>> # rates: dict of frame rate and sampling rate: keys=\"v:0\" and \"a:0\"\n >>> # data: dict of video frame array and audio sample array: keys=\"v:0\" and \"a:0\"\n\n >>> # combine video and audio files\n >>> rates, data = ffmpegio.media.read('myvideo.mp4','myaudio.mp3')\n\n >>> # get output of complex filtergraph (can take multiple inputs)\n >>> expr = \"[v:0]split=2[out0][l1];[l1]edgedetect[out1]\"\n >>> rates, data = ffmpegio.media.read('myvideo.mp4',filter_complex=expr,map=['[out0]','[out1]'])\n >>> # rates: dict of frame rates: keys=\"v:0\" and \"v:1\"\n >>> # data: dict of video frame arrays: keys=\"v:0\" and \"v:1\"\n\n.. _ex_write:\n\nWrite Audio, Image, & Video Files\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> # create a video file from a numpy array\n >>> ffmpegio.video.write('myvideo.mp4', rate, F)\n\n >>> # create an image file from a numpy array\n >>> ffmpegio.image.write('myimage.png', F)\n\n >>> # create an audio file from a numpy array\n >>> ffmpegio.audio.write('myaudio.mp3', rate, x)\n\n.. _ex_filter:\n\nFilter Audio, Image, & Video Data\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> # Add fade-in and fade-out effects to audio data\n >>> fs_out, y = ffmpegio.audio.filter('afade=t=in:ss=0:d=15,afade=t=out:st=875:d=25', fs_in, x)\n\n >>> # Apply mirror effect to an image\n >>> I_out = ffmpegio.image.filter('crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left][right] hstack', I_in)\n\n >>> # Add text at the center of the video frame\n >>> filter = \"drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2\"\n >>> fs_out, F_out = ffmpegio.video.filter(filter, fs_in, F_in)\n\n.. _ex_stream:\n\nStream I/O\n^^^^^^^^^^\n\n.. code-block:: python\n\n >>> # process video 100 frames at a time and save output as a new video \n >>> # with the same frame rate\n >>> with ffmpegio.open('myvideo.mp4', 'rv', blocksize=100) as fin,\n >>> ffmpegio.open('myoutput.mp4', 'wv', rate=fin.frame_rate) as fout:\n >>> for frames in fin:\n >>> fout.write(myprocess(frames))\n\n.. _ex_devices:\n\nDevice I/O Enumeration\n^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> # record 5 minutes of audio from Windows microphone\n >>> fs, x = ffmpegio.audio.read('a:0', f_in='dshow', sample_fmt='dbl', t=300)\n\n >>> # capture Windows' webcam frame\n >>> with ffmpegio.open('v:0', 'rv', f_in='dshow') as webcam,\n >>> for frame in webcam:\n >>> process_frame(frame)\n\n.. _ex_progress:\n\nProgress Callback\n^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> import pprint\n\n >>> # progress callback\n >>> def progress(info, done):\n >>> pprint(info) # bunch of stats\n >>> if done:\n >>> print('video decoding completed')\n >>> else:\n >>> return check_cancel_command(): # return True to kill immediately\n \n >>> # can be used in any butch processing\n >>> rate, F = ffmpegio.video.read('myvideo.mp4', progress=progress)\n\n >>> # as well as for stream processing\n >>> with ffmpegio.open('myvideo.mp4', 'rv', blocksize=100, progress=progress) as fin:\n >>> for frames in fin:\n >>> myprocess(frames)\n\n.. _ex_direct:\n\nRun FFmpeg and FFprobe Directly\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n >>> from ffmpegio import ffmpeg, FFprobe, ffmpegprocess\n >>> from subprocess import PIPE\n\n >>> # call with options as a long string\n >>> ffmpeg('-i input.avi -b:v 64k -bufsize 64k output.avi')\n\n >>> # or call with list of options\n >>> ffmpeg(['-i', 'input.avi' ,'-r', '24', 'output.avi'])\n\n >>> # the same for ffprobe\n >>> ffprobe('ffprobe -show_streams -select_streams a INPUT')\n\n >>> # specify subprocess arguments to capture stdout\n >>> out = ffprobe('ffprobe -of json -show_frames INPUT', \n stdout=PIPE, universal_newlines=True).stdout\n\n >>> # use ffmpegprocess to take advantage of ffmpegio's default behaviors\n >>> out = ffmpegprocess.run({\"inputs\": [(\"input.avi\", None)],\n \"outputs\": [(\"out1.mp4\", None),\n (\"-\", {\"f\": \"rawvideo\", \"vframes\": 1, \"pix_fmt\": \"gray\", \"an\": None})\n }, capture_log=True)\n >>> print(out.stderr) # print the captured FFmpeg logs (banner text omitted)\n >>> b = out.stdout # width*height bytes of the first frame\n",
"bugtrack_url": null,
"license": "GPL-2.0 License",
"summary": "Media I/O with FFmpeg and NumPy array",
"version": "0.9.1",
"project_urls": {
"Discussions": "https://github.com/python-ffmpegio/python-ffmpegio/discussions",
"Home": "https://python-ffmpegio.github.io/python-ffmpegio",
"Issues": "https://github.com/python-ffmpegio/python-ffmpegio/issues",
"Pull Requests": "https://github.com/python-ffmpegio/python-ffmpegio/pulls",
"Repository": "https://github.com/python-ffmpegio/python-ffmpegio"
},
"split_keywords": [
"multimedia",
"ffmpeg"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "3cadcf0ed30b5d3cd20102d0429735c5a2e8dd1ffaeda4ef01e62c90bfe9d282",
"md5": "65d6b4ecbb5bec68d1c3ffaf53aecb39",
"sha256": "65a6cea4da4071063e9a57d9363739d9f0108577fd4c1526e88b02ff131667ce"
},
"downloads": -1,
"filename": "ffmpegio-0.9.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "65d6b4ecbb5bec68d1c3ffaf53aecb39",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 13551,
"upload_time": "2024-02-20T04:14:13",
"upload_time_iso_8601": "2024-02-20T04:14:13.741926Z",
"url": "https://files.pythonhosted.org/packages/3c/ad/cf0ed30b5d3cd20102d0429735c5a2e8dd1ffaeda4ef01e62c90bfe9d282/ffmpegio-0.9.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bd7f89e11f2d34c78c40de5acf54dbdcea8ff04c3ff81848c367db8bc6885471",
"md5": "0bd57607c8859172adbb43c6726f7369",
"sha256": "4f94a035f284d5cd2fd8880147f6ea16ea477b92a0d4fc5db380dc4bfc433c9d"
},
"downloads": -1,
"filename": "ffmpegio-0.9.1.tar.gz",
"has_sig": false,
"md5_digest": "0bd57607c8859172adbb43c6726f7369",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 15224,
"upload_time": "2024-02-20T04:14:15",
"upload_time_iso_8601": "2024-02-20T04:14:15.233991Z",
"url": "https://files.pythonhosted.org/packages/bd/7f/89e11f2d34c78c40de5acf54dbdcea8ff04c3ff81848c367db8bc6885471/ffmpegio-0.9.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-02-20 04:14:15",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "python-ffmpegio",
"github_project": "python-ffmpegio",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "ffmpegio"
}