Metadata-Version: 2.1
Name: bewegung
Version: 0.0.5
Summary: a versatile video renderer
Home-page: https://github.com/pleiszenburg/bewegung
Author: Sebastian M. Ernst
Author-email: ernst@pleiszenburg.de
License: LGPLv2
Download-URL: https://github.com/pleiszenburg/bewegung/archive/v0.0.5.tar.gz
Keywords: video,animation,animation-framework,rendering,rendering,rendering-engine,compositor
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Education
Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Healthcare Industry
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)
Classifier: Operating System :: MacOS
Classifier: Operating System :: POSIX :: BSD
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Topic :: Artistic Software
Classifier: Topic :: Education
Classifier: Topic :: Multimedia
Classifier: Topic :: Multimedia :: Graphics
Classifier: Topic :: Multimedia :: Graphics :: Presentation
Classifier: Topic :: Multimedia :: Sound/Audio
Classifier: Topic :: Multimedia :: Sound/Audio :: Editors
Classifier: Topic :: Multimedia :: Sound/Audio :: Mixers
Classifier: Topic :: Multimedia :: Video
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Scientific/Engineering :: Visualization
Classifier: Topic :: Software Development :: Libraries
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: Pillow
Provides-Extra: all
Requires-Dist: PyGObject ; extra == 'all'
Requires-Dist: numpy ; extra == 'all'
Requires-Dist: numba ; extra == 'all'
Requires-Dist: sphinx-rtd-theme ; extra == 'all'
Requires-Dist: Sphinx ; extra == 'all'
Requires-Dist: psutil ; extra == 'all'
Requires-Dist: typeguard ; extra == 'all'
Requires-Dist: wheel ; extra == 'all'
Requires-Dist: pycairo ; extra == 'all'
Requires-Dist: python-language-server[all] ; extra == 'all'
Requires-Dist: twine ; extra == 'all'
Requires-Dist: mplcairo ; extra == 'all'
Requires-Dist: tqdm ; extra == 'all'
Requires-Dist: black ; extra == 'all'
Requires-Dist: setuptools ; extra == 'all'
Requires-Dist: matplotlib ; extra == 'all'
Requires-Dist: myst-parser ; extra == 'all'
Requires-Dist: ipython ; extra == 'all'
Requires-Dist: sphinxembeddedvideos ; extra == 'all'
Requires-Dist: sphinx-autodoc-typehints ; extra == 'all'
Requires-Dist: datashader ; extra == 'all'
Provides-Extra: cairo
Requires-Dist: pycairo ; extra == 'cairo'
Provides-Extra: datashader
Requires-Dist: datashader ; extra == 'datashader'
Provides-Extra: dev
Requires-Dist: black ; extra == 'dev'
Requires-Dist: python-language-server[all] ; extra == 'dev'
Requires-Dist: psutil ; extra == 'dev'
Requires-Dist: setuptools ; extra == 'dev'
Requires-Dist: Sphinx ; extra == 'dev'
Requires-Dist: sphinx-autodoc-typehints ; extra == 'dev'
Requires-Dist: sphinx-rtd-theme ; extra == 'dev'
Requires-Dist: sphinxembeddedvideos ; extra == 'dev'
Requires-Dist: myst-parser ; extra == 'dev'
Requires-Dist: twine ; extra == 'dev'
Requires-Dist: wheel ; extra == 'dev'
Provides-Extra: docs
Requires-Dist: numpy ; extra == 'docs'
Requires-Dist: pycairo ; extra == 'docs'
Requires-Dist: python-language-server[all] ; extra == 'docs'
Requires-Dist: twine ; extra == 'docs'
Requires-Dist: mplcairo ; extra == 'docs'
Requires-Dist: numba ; extra == 'docs'
Requires-Dist: tqdm ; extra == 'docs'
Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
Requires-Dist: Sphinx ; extra == 'docs'
Requires-Dist: setuptools ; extra == 'docs'
Requires-Dist: black ; extra == 'docs'
Requires-Dist: matplotlib ; extra == 'docs'
Requires-Dist: myst-parser ; extra == 'docs'
Requires-Dist: ipython ; extra == 'docs'
Requires-Dist: psutil ; extra == 'docs'
Requires-Dist: typeguard ; extra == 'docs'
Requires-Dist: sphinxembeddedvideos ; extra == 'docs'
Requires-Dist: sphinx-autodoc-typehints ; extra == 'docs'
Requires-Dist: datashader ; extra == 'docs'
Requires-Dist: wheel ; extra == 'docs'
Provides-Extra: drawingboard
Requires-Dist: pycairo ; extra == 'drawingboard'
Requires-Dist: PyGObject ; extra == 'drawingboard'
Provides-Extra: ipython
Requires-Dist: ipython ; extra == 'ipython'
Provides-Extra: matplotlib
Requires-Dist: numpy ; extra == 'matplotlib'
Requires-Dist: matplotlib ; extra == 'matplotlib'
Requires-Dist: pycairo ; extra == 'matplotlib'
Requires-Dist: mplcairo ; extra == 'matplotlib'
Provides-Extra: numba
Requires-Dist: numba ; extra == 'numba'
Provides-Extra: numpy
Requires-Dist: numpy ; extra == 'numpy'
Provides-Extra: tqdm
Requires-Dist: tqdm ; extra == 'tqdm'
Provides-Extra: typeguard
Requires-Dist: typeguard ; extra == 'typeguard'

![bewegung_logo](https://github.com/pleiszenburg/bewegung/blob/master/docs/_static/logo01.png?raw=true "bewegung logo")

# BEWEGUNG

*/bəˈveːɡʊŋ/ ([German, noun, feminine: motion/movement/animation](https://dict.leo.org/englisch-deutsch/bewegung))*

[![docs_master](https://readthedocs.org/projects/bewegung/badge/?version=latest&style=flat-square "Documentation Status: master / release")](https://bewegung.readthedocs.io/en/latest/)
[![license](https://img.shields.io/pypi/l/bewegung.svg?style=flat-square "LGPL 2.1")](https://github.com/pleiszenburg/bewegung/blob/master/LICENSE)
[![status](https://img.shields.io/pypi/status/bewegung.svg?style=flat-square "Project Development Status")](https://github.com/pleiszenburg/bewegung/issues)
[![pypi_version](https://img.shields.io/pypi/v/bewegung.svg?style=flat-square "pypi version")](https://pypi.python.org/pypi/bewegung)
[![conda_version](https://img.shields.io/conda/vn/conda-forge/bewegung.svg?style=flat-square "conda version")](https://anaconda.org/conda-forge/bewegung)
[![pypi_versions](https://img.shields.io/pypi/pyversions/bewegung.svg?style=flat-square "Available on PyPi - the Python Package Index")](https://pypi.python.org/pypi/bewegung)
[![chat](https://img.shields.io/matrix/bewegung:matrix.org.svg?style=flat-square "Matrix Chat Room")](https://matrix.to/#/#bewegung:matrix.org)
[![mailing_list](https://img.shields.io/badge/mailing%20list-groups.io-8cbcd1.svg?style=flat-square "Mailing List")](https://groups.io/g/bewegung-dev)

## Synopsis

`bewegung` is a versatile video renderer, primarily targeting scientific visualizations of large quantities of data. Its core concepts are *sequences* and *layers*. Sequences describe a certain time span within a video and can overlap. Each sequence can hold multiple layers. Layers can be generated with [`cairo`](https://cairographics.org/), [`Pillow`](https://pillow.readthedocs.io), [`datashader`](https://datashader.org/), [`matplotlib`](https://matplotlib.org/) and `bewegung`'s internal drawing system [`DrawingBoard`](https://bewegung.readthedocs.io/en/latest/canvas.html). Final compositing of every video frame and video effects are implemented via `Pillow`. Video encoding is handled by `ffmpeg`. `bewegung` also includes a simple [vector algebra system](https://bewegung.readthedocs.io/en/latest/vectors.html) and a ["camera" for 3D to 2D projections](https://bewegung.readthedocs.io/en/latest/camera.html). `bewegung` is developed with ease of use, compute time and memory efficiency in mind.

## Installation

`bewegung` can be installed both via ``conda`` and via ``pip``.

### Via `pip`

A bare **minimum** of `bewegung` can be installed with Python's package manager `pip`:

```bash
pip install -vU bewegung
```

A **complete** installation of all optional Python components and development tools can be triggered by running:

```bash
pip install -vU bewegung[all]
```

Certain non-Python **prerequisites** must installed separately and before invoking the above command. [For detailed instructions, see documentation](https://bewegung.readthedocs.io/en/latest/installation.html). Most notably, `ffmpeg` should be installed for producing actual video files instead of video frames as individual files. See [download section](https://ffmpeg.org/download.html) of the `ffmpeg` project website for further instructions.

### Via `conda`

An almost complete installation can be triggered by running:

```bash
conda install -c conda-forge bewegung
```

Please note that [mplcairo](https://github.com/matplotlib/mplcairo), a dependency of `bewegung` and alternative backend for `matplotlib`, is currently not available via `conda` and must be installed manually. `bewegung` [does also work without `mplcairo` present](https://bewegung.readthedocs.io/en/latest/canvas.html#acceleratingmatplotlib) and falls back to the `cairo` backend of `matplotlib`.

## Example

See [`demo.py`](https://github.com/pleiszenburg/bewegung/blob/master/demo/demo.py).

You can directly test it by running:

```bash
curl https://raw.githubusercontent.com/pleiszenburg/bewegung/master/demo/demo.py | python3
```

This resulting `video.mp4` file should look like this:

[![bewegung standard demo](https://img.youtube.com/vi/4NFXQ73weMA/sddefault.jpg)](https://www.youtube.com/watch?v=4NFXQ73weMA)

## Usage

See [documentation](https://bewegung.readthedocs.io).

`bewegung`'s development status is "well-tested alpha". Its API should not be considered stable until the project is labeled "beta" or better, although significant changes are very unlikely.

`bewegung` can be drastically accelerated by deactivating debugging features. See [relevant section in the documentation](https://bewegung.readthedocs.io/en/latest/performance.html#typecheckingperformance).


