Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/livingbio/typed-ffmpeg

Modern Python FFmpeg wrappers offer comprehensive support for complex filters, complete with detailed typing and documentation.
https://github.com/livingbio/typed-ffmpeg

ffmpeg ffmpeg-python ffmpeg-wrapper media media-processing multi-media python typing

Last synced: 3 days ago
JSON representation

Modern Python FFmpeg wrappers offer comprehensive support for complex filters, complete with detailed typing and documentation.

Awesome Lists containing this project

README

        

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## typed-ffmpeg\n",
"\n",
"[![CI Package](https://github.com/livingbio/typed-ffmpeg/actions/workflows/ci-package.yml/badge.svg)](https://github.com/livingbio/typed-ffmpeg/actions?query=workflow%3Aci-package)\n",
"[![Documentation](https://img.shields.io/badge/docs-mkdocs%20material-blue.svg?style=flat)](https://livingbio.github.io/typed-ffmpeg/)\n",
"[![PyPI Version](https://img.shields.io/pypi/v/typed-ffmpeg.svg)](https://pypi.org/project/typed-ffmpeg/)\n",
"[![codecov](https://codecov.io/gh/livingbio/typed-ffmpeg/graph/badge.svg?token=B95PR629LP)](https://codecov.io/gh/livingbio/typed-ffmpeg)\n",
"\n",
"**typed-ffmpeg** offers a modern, Pythonic interface to FFmpeg, providing extensive support for complex filters with detailed typing and documentation. Inspired by `ffmpeg-python`, this package enhances functionality by addressing common limitations, such as lack of IDE integration and comprehensive typing, while also introducing new features like JSON serialization of filter graphs and automatic FFmpeg validation.\n",
"\n",
"---\n",
"\n",
"### Table of Contents\n",
"\n",
"- [Features](#features)\n",
"- [Installation](#installation)\n",
"- [Quick Usage](#quick-usage)\n",
"- [Documentation](https://livingbio.github.io/typed-ffmpeg/)\n",
"- [Acknowledgements](#acknowledgements)\n",
"\n",
"---\n",
"\n",
"## Features\n",
"\n",
"![typed-ffmpeg](https://raw.githubusercontent.com/livingbio/typed-ffmpeg/main/docs/media/autocomplete.png)\n",
"\n",
"\n",
"- **Zero Dependencies:** Built purely with the Python standard library, ensuring maximum compatibility and security.\n",
"- **User-Friendly:** Simplifies the construction of filter graphs with an intuitive Pythonic interface.\n",
"- **Comprehensive FFmpeg Filter Support:** Out-of-the-box support for most FFmpeg filters, with IDE auto-completion.\n",
"- **Integrated Documentation:** In-line docstrings provide immediate reference for filter usage, reducing the need to consult external documentation.\n",
"- **Robust Typing:** Offers static and dynamic type checking, enhancing code reliability and development experience.\n",
"- **Filter Graph Serialization:** Enables saving and reloading of filter graphs in JSON format for ease of use and repeatability.\n",
"- **Graph Visualization:** Leverages `graphviz` for visual representation, aiding in understanding and debugging.\n",
"- **Validation and Auto-correction:** Assists in identifying and fixing errors within filter graphs.\n",
"- **Input and Output Options Support:** Provide a more comprehensive interface for input and output options, including support for additional codecs and formats.\n",
"- **Partial Evaluation:** Enhance the flexibility of filter graphs by enabling partial evaluation, allowing for modular construction and reuse.\n",
"\n",
"### Planned Features\n",
"\n",
"Please note that the following features are under consideration or development for future releases:\n",
"\n",
"- **Extended FFmpeg Version Support:** While `typed-ffmpeg` is currently built with FFmpeg version 6.0 in mind, we are working to ensure compatibility across different FFmpeg versions. Feedback and issue reports are welcome to improve version support.\n",
"- **Additional Filter Support:** We aim to expand the range of FFmpeg filters supported by `typed-ffmpeg`. Continuous updates will be made to include more complex and varied filters.\n",
"\n",
"---\n",
"\n",
"## Installation\n",
"\n",
"To install `typed-ffmpeg`, simply use pip:\n",
"\n",
"```bash\n",
"pip install typed-ffmpeg\n",
"```\n",
"\n",
"Note: FFmpeg must be installed on your system.\n",
"\n",
"### Visualization Support\n",
"\n",
"To enable graph visualization features:\n",
"\n",
"```bash\n",
"pip install 'typed-ffmpeg[graph]'\n",
"```\n",
"\n",
"Note: This requires Graphviz to be installed on your system.\n",
"\n",
"---\n",
"\n",
"## Quick Usage\n",
"\n",
"Here's how to quickly start using `typed-ffmpeg`:\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"%3\n",
"\n",
"\n",
"\n",
"25ed430750f863d6\n",
"\n",
"input.mp4\n",
"\n",
"\n",
"\n",
"6fce989decc232cd\n",
"\n",
"hflip\n",
"\n",
"\n",
"\n",
"25ed430750f863d6->6fce989decc232cd\n",
"\n",
"\n",
"* => 0\n",
"\n",
"\n",
"\n",
"32ff1b4d03cc4d4\n",
"\n",
"output.mp4\n",
"\n",
"\n",
"\n",
"6fce989decc232cd->32ff1b4d03cc4d4\n",
"\n",
"\n",
"0 => 0\n",
"\n",
"\n",
"\n"
],
"text/plain": [
"OutputStream(node=OutputNode(kwargs=(), inputs=(VideoStream(node=FilterNode(kwargs=(), inputs=(AVStream(node=InputNode(kwargs=(), inputs=(), filename='input.mp4'), index=None),), name='hflip', input_typings=(,), output_typings=(,)), index=0),), filename='output.mp4'), index=None)"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import ffmpeg\n",
"\n",
"# Flip video horizontally and output\n",
"f = (\n",
" ffmpeg\n",
" .input(filename='input.mp4')\n",
" .hflip()\n",
" .output(filename='output.mp4')\n",
")\n",
"f"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For a more complex example:\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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gaSpENvf0ZHUTIbu1iVdsbGxjg5FqkmrVq34+eefMRgM9OjRg5EjRxITE0OjRo2ues3ixYsZNmwYlo1XPUUusfgrGPbsxTozVcVsNtOpUyeOHz/Onj178PT0BKzFtzt16sTp06fJzs62tVelyMhIVqxYgdlspk+fPowYMYKYmBh8fa9QlbucatL4RERExLloho+IiDidW2+9lYSEBHJycvjhhx949NFHfzfZIzWXi4sLc+fOJT8/n1GjRpGXl8dvv/3GY489xq5du5g9e3a1JUNyc3OZPHkyOTk5fPPNN8TFxVUq2QM1a3wiIiLiXLRLl4iIOJ0lS5Y4OoQbxvLly+nSpQstW7assnv07NmTtLQ0Jk2aRGBgIGazmR49erB27Vp69+597Q7sZNOmTVXSb00Zn4iIiDgXJXxERETkug0aNAiABg0a0LVrV7p06UKXLl3o2rUrwcHBFd616mq6detGamqqXfqqiZx9fCIiIlL9lPARERGR63bixAm2bt1KZmYmGRkZ/Pjjj8yaNYuzZ8/i5uZG+/btMZlMBAcHExISwm233Ubjxo0dHbaIiIiI01PCR0RERK5b/fr1CQ0NJTQ01NZWVFTE/v37ycjIID09nfT0dGbNmmXb+crf379UEigkJISgoCBcXFRaUERERMRelPARERERu3JzcyMgIICAgACio6Nt7ceOHSuVBPr666/55z//SXFxMT4+PrRv375UEugPf/gDdevWdeBIRERERGovJXxERESkWvj6+paZDVRYWMiuXbtsSaD09HSSk5M5ffo0rq6u3HLLLaWSQN27d8ff39+Bo3BuixcvdnQITqFFixbcfvvtjg5D7OTgwYOkpaU5Oowbhp4f56Lnp/r06tWL5s2bl2pTwkdEREQcxsPDA5PJhMlkYuTIkbb23NzcUkmgBQsW8MorrwDWxNGlSaCQkBA6dOiAq6uro4bhNIYNG+boEJzC0KFDtVugE0lLS9OzUY30/DgXPT/VJykpidjY2FJtSviIiIhIjdO0aVOaNm1aaknY8ePH2b59uy0JtH79embNmkVBQQEeHh60bdvWlgAymUz84Q9/oEGDBg4cRe2UNBVi+zs6itorZoKjI5CqYtno6Aicn54f5zVro8XRITi1h7sbrtiuhI+IiIjUCkajscySsAsXLpCdnU16erptp7DJkydz9OhRwFog+tIk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",
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"%3\n",
"\n",
"\n",
"\n",
"25ed430750f863d6\n",
"\n",
"input.mp4\n",
"\n",
"\n",
"\n",
"635946df01b03434\n",
"\n",
"trim\n",
"\n",
"\n",
"\n",
"25ed430750f863d6->635946df01b03434\n",
"\n",
"\n",
"* => 0\n",
"\n",
"\n",
"\n",
"d695cb69537e6d9\n",
"\n",
"trim\n",
"\n",
"\n",
"\n",
"25ed430750f863d6->d695cb69537e6d9\n",
"\n",
"\n",
"* => 0\n",
"\n",
"\n",
"\n",
"5d67304cc19b04fd\n",
"\n",
"overlay.png\n",
"\n",
"\n",
"\n",
"48cecfc816831f2a\n",
"\n",
"hflip\n",
"\n",
"\n",
"\n",
"5d67304cc19b04fd->48cecfc816831f2a\n",
"\n",
"\n",
"* => 0\n",
"\n",
"\n",
"\n",
"65db7656991f446\n",
"\n",
"concat\n",
"\n",
"\n",
"\n",
"635946df01b03434->65db7656991f446\n",
"\n",
"\n",
"0 => 0\n",
"\n",
"\n",
"\n",
"d695cb69537e6d9->65db7656991f446\n",
"\n",
"\n",
"0 => 1\n",
"\n",
"\n",
"\n",
"1bf8065c3f485708\n",
"\n",
"overlay\n",
"\n",
"\n",
"\n",
"48cecfc816831f2a->1bf8065c3f485708\n",
"\n",
"\n",
"0 => 1\n",
"\n",
"\n",
"\n",
"65db7656991f446->1bf8065c3f485708\n",
"\n",
"\n",
"0 => 0\n",
"\n",
"\n",
"\n",
"729d505df6329c97\n",
"\n",
"drawbox\n",
"\n",
"\n",
"\n",
"1bf8065c3f485708->729d505df6329c97\n",
"\n",
"\n",
"0 => 0\n",
"\n",
"\n",
"\n",
"2ca1c9826f62c5d7\n",
"\n",
"out.mp4\n",
"\n",
"\n",
"\n",
"729d505df6329c97->2ca1c9826f62c5d7\n",
"\n",
"\n",
"0 => 0\n",
"\n",
"\n",
"\n"
],
"text/plain": [
"OutputStream(node=OutputNode(kwargs=(), inputs=(VideoStream(node=FilterNode(kwargs=(('x', '50'), ('y', '50'), ('width', '120'), ('height', '120'), ('color', 'red'), ('thickness', '5')), inputs=(VideoStream(node=FilterNode(kwargs=(), inputs=(VideoStream(node=FilterNode(kwargs=(('n', 2),), inputs=(VideoStream(node=FilterNode(kwargs=(('start_frame', 10), ('end_frame', 20)), inputs=(AVStream(node=InputNode(kwargs=(), inputs=(), filename='input.mp4'), index=None),), name='trim', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(kwargs=(('start_frame', 30), ('end_frame', 40)), inputs=(AVStream(node=InputNode(kwargs=(), inputs=(), filename='input.mp4'), index=None),), name='trim', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, ), output_typings=(,)), index=0), VideoStream(node=FilterNode(kwargs=(), inputs=(AVStream(node=InputNode(kwargs=(), inputs=(), filename='overlay.png'), index=None),), name='hflip', input_typings=(,), output_typings=(,)), index=0)), name='overlay', input_typings=(, ), output_typings=(,)), index=0),), name='drawbox', input_typings=(,), output_typings=(,)), index=0),), filename='out.mp4'), index=None)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import ffmpeg.filters\n",
"import ffmpeg\n",
"\n",
"# Complex filter graph example\n",
"in_file = ffmpeg.input(\"input.mp4\")\n",
"overlay_file = ffmpeg.input(\"overlay.png\")\n",
"\n",
"f = (\n",
" ffmpeg.filters\n",
" .concat(\n",
" in_file.trim(start_frame=10, end_frame=20),\n",
" in_file.trim(start_frame=30, end_frame=40),\n",
" )\n",
" .video(0)\n",
" .overlay(overlay_file.hflip())\n",
" .drawbox(x=\"50\", y=\"50\", width=\"120\", height=\"120\", color=\"red\", thickness=\"5\")\n",
" .output(filename=\"out.mp4\")\n",
")\n",
"f"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"See the [Usage](https://livingbio.github.io/typed-ffmpeg/usage/typed/) section in our documentation for more examples and detailed guides.\n",
"\n",
"\n",
"---\n",
"\n",
"## Acknowledgements\n",
"\n",
"This project was initially inspired by the capabilities of GPT-3, with the original concept focusing on using GPT-3 to generate an FFmpeg filter SDK directly from the FFmpeg documentation. However, during the development process, I encountered limitations with GPT-3's ability to fully automate this task.\n",
"\n",
"As a result, I shifted to traditional code generation methods to complete the SDK, ensuring a more robust and reliable tool. Despite this change in approach, both GitHub Copilot and GPT-3 were instrumental in accelerating the development process, providing valuable insights and saving significant time.\n",
"\n",
"I would also like to extend my gratitude to the `ffmpeg-python` project, which inspired this project significantly. The API style and design ideas from `ffmpeg-python` have been influential, and I have utilized these aspects to shape the development of our SDK.\n",
"\n",
"This project is dedicated to my son, Austin, on his seventh birthday (February 24, 2024), whose curiosity and zest for life continually inspire me.\n",
"\n",
"---\n",
"\n",
"Feel free to check the [Documentation](https://livingbio.github.io/typed-ffmpeg/) for detailed information and more advanced features.\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}