time-lapse


Nametime-lapse JSON
Version 8.0 PyPI version JSON
download
home_pageNone
SummaryTime-lapse movie assembly
upload_time2024-11-09 15:15:17
maintainerNone
docs_urlNone
authorNone
requires_python>=3.13
licenseNone
keywords ffmpeg photography time-lapse
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Time-Lapse assembling

[![PyPI](https://img.shields.io/pypi/v/time-lapse)](https://pypi.org/project/time-lapse/)
[![License](https://img.shields.io/github/license/153957/time-lapse)](https://github.com/153957/time-lapse/blob/main/LICENSE)
[![Build](https://img.shields.io/github/actions/workflow/status/153957/time-lapse/tests.yml?branch=main)](https://github.com/153957/time-lapse/actions)

This repo contains tools used to compile Time-lapse movies using
ffmpeg. The ffmpeg utility is controlled via the ffmpeg-python wrapper.

Example usage of this package can be found in the
[time-lapse scripts](https://github.com/153957/time-lapse-scripts) repository.

## Convert movie

Using time-lapse to find tif files, and create a movie called 'test_movie'
with 24 fps and deflickered:

    from time_lapse import output, source

    source_input = source.get_input(['*.tif'], fps=24, deflicker=7, filters=None)
    output.create_outputs(source_input, 'test_movie', verbose=False)

This can also be done via the CLI:

    timelapse --name test_movie --pattern "*.tif" --fps 24 --deflicker 7

### Inspection

By passing `verbose=True` to create outputs the following ffmpeg-python
inspection methods will be performed.

Show the ffmpeg command options ffmpeg-python would use:

    .get_args()

By using graphviz the graph from input to output can be shown using:

    .view()

## Installation

This package requires the `ffmpeg` tool to be installed.

    brew install ffmpeg

Then install this package:

    pip install time-lapse

Additionally, when using the verbose output option a graph will be
rendered using `graphviz`, this requires the Graphviz library and the
related Python package:

    brew install graphviz
    pip install time-lapse[graph]

## Codec

For near-universal compatibility the H.264 codec is used. The following
section describe some of the choices for specific configuration options.

See the ffmpeg wiki for additional information:
<https://trac.ffmpeg.org/wiki/Encode/H.264>

### Constant Rate Factor

This uses `-crf 20` to set a constant rate factor, which means the overall
quality of the movie should be constant. So bitrate varies to ensure
this. Higher value is lower quality. The quality and bit rates at this
value seem reasonable.

### Preset

`-preset slower` is used to improve the compression ratio for the selected
quality (crf), without taking too much time.

### Faststart

`-movflags +faststart` is used to allow the movie to quickly start playing,
while it is still loading or buffering.

### Quicktime support

The codec defaults to YUV 444, which is not supported by Quicktime. So
add `pix_fmt yuv420p` to fix Quicktime support.

## Input

### Select input frames

Use frames as input by giving a glob pattern which matches the desired
images. Usually these will be tiff images so use
`-pattern_type glob -i "*.tiff"`.

### Framerate

When using image sequences as input the framerate of the desired output
should be given using `-framerate 30`.

## Filters

Commonly used filters:

- Deflicker <https://ffmpeg.org/ffmpeg-filters.html#toc-deflicker>
- Scale <https://ffmpeg.org/ffmpeg-filters.html#scale>
- Crop <https://ffmpeg.org/ffmpeg-filters.html#crop>
- Drawtext <https://ffmpeg.org/ffmpeg-filters.html#drawtext-1>
- Video sizes <https://ffmpeg.org/ffmpeg-utils.html#video-size-syntax>

### Steps

The optimal order for applying deflicker/scale/watermarking is the following:

- First deflicker the video to ensure it is equally deflickered for
  all outputs
- Then scale and crop the videos to fit the desired final resolutions
- Then add the watermark (which should not be deflickered and a constant size)

### Scale video

Add scaling to ensure it fits in given dimensions. Negative values for
width or height make the encoder figure out the size by itself, keeping
the aspect ratio of the source. The integer of the negative value, i.e.
4 for -4, means that the size should be devisble by that value. TODO:
does it just scale/squish the video or crop?:

    -vf scale=1920:-2
    -vf scale=960:540:aspect..

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "time-lapse",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.13",
    "maintainer_email": "Arne de Laat <arne@delaat.net>",
    "keywords": "ffmpeg, photography, time-lapse",
    "author": null,
    "author_email": "Arne de Laat <arne@delaat.net>",
    "download_url": "https://files.pythonhosted.org/packages/1c/ac/d4032867f96a07f0d2085d86d8aa87e2ced611deb7b39c8a5183123b2d7e/time_lapse-8.0.tar.gz",
    "platform": null,
    "description": "# Time-Lapse assembling\n\n[![PyPI](https://img.shields.io/pypi/v/time-lapse)](https://pypi.org/project/time-lapse/)\n[![License](https://img.shields.io/github/license/153957/time-lapse)](https://github.com/153957/time-lapse/blob/main/LICENSE)\n[![Build](https://img.shields.io/github/actions/workflow/status/153957/time-lapse/tests.yml?branch=main)](https://github.com/153957/time-lapse/actions)\n\nThis repo contains tools used to compile Time-lapse movies using\nffmpeg. The ffmpeg utility is controlled via the ffmpeg-python wrapper.\n\nExample usage of this package can be found in the\n[time-lapse scripts](https://github.com/153957/time-lapse-scripts) repository.\n\n## Convert movie\n\nUsing time-lapse to find tif files, and create a movie called 'test_movie'\nwith 24 fps and deflickered:\n\n    from time_lapse import output, source\n\n    source_input = source.get_input(['*.tif'], fps=24, deflicker=7, filters=None)\n    output.create_outputs(source_input, 'test_movie', verbose=False)\n\nThis can also be done via the CLI:\n\n    timelapse --name test_movie --pattern \"*.tif\" --fps 24 --deflicker 7\n\n### Inspection\n\nBy passing `verbose=True` to create outputs the following ffmpeg-python\ninspection methods will be performed.\n\nShow the ffmpeg command options ffmpeg-python would use:\n\n    .get_args()\n\nBy using graphviz the graph from input to output can be shown using:\n\n    .view()\n\n## Installation\n\nThis package requires the `ffmpeg` tool to be installed.\n\n    brew install ffmpeg\n\nThen install this package:\n\n    pip install time-lapse\n\nAdditionally, when using the verbose output option a graph will be\nrendered using `graphviz`, this requires the Graphviz library and the\nrelated Python package:\n\n    brew install graphviz\n    pip install time-lapse[graph]\n\n## Codec\n\nFor near-universal compatibility the H.264 codec is used. The following\nsection describe some of the choices for specific configuration options.\n\nSee the ffmpeg wiki for additional information:\n<https://trac.ffmpeg.org/wiki/Encode/H.264>\n\n### Constant Rate Factor\n\nThis uses `-crf 20` to set a constant rate factor, which means the overall\nquality of the movie should be constant. So bitrate varies to ensure\nthis. Higher value is lower quality. The quality and bit rates at this\nvalue seem reasonable.\n\n### Preset\n\n`-preset slower` is used to improve the compression ratio for the selected\nquality (crf), without taking too much time.\n\n### Faststart\n\n`-movflags +faststart` is used to allow the movie to quickly start playing,\nwhile it is still loading or buffering.\n\n### Quicktime support\n\nThe codec defaults to YUV 444, which is not supported by Quicktime. So\nadd `pix_fmt yuv420p` to fix Quicktime support.\n\n## Input\n\n### Select input frames\n\nUse frames as input by giving a glob pattern which matches the desired\nimages. Usually these will be tiff images so use\n`-pattern_type glob -i \"*.tiff\"`.\n\n### Framerate\n\nWhen using image sequences as input the framerate of the desired output\nshould be given using `-framerate 30`.\n\n## Filters\n\nCommonly used filters:\n\n- Deflicker <https://ffmpeg.org/ffmpeg-filters.html#toc-deflicker>\n- Scale <https://ffmpeg.org/ffmpeg-filters.html#scale>\n- Crop <https://ffmpeg.org/ffmpeg-filters.html#crop>\n- Drawtext <https://ffmpeg.org/ffmpeg-filters.html#drawtext-1>\n- Video sizes <https://ffmpeg.org/ffmpeg-utils.html#video-size-syntax>\n\n### Steps\n\nThe optimal order for applying deflicker/scale/watermarking is the following:\n\n- First deflicker the video to ensure it is equally deflickered for\n  all outputs\n- Then scale and crop the videos to fit the desired final resolutions\n- Then add the watermark (which should not be deflickered and a constant size)\n\n### Scale video\n\nAdd scaling to ensure it fits in given dimensions. Negative values for\nwidth or height make the encoder figure out the size by itself, keeping\nthe aspect ratio of the source. The integer of the negative value, i.e.\n4 for -4, means that the size should be devisble by that value. TODO:\ndoes it just scale/squish the video or crop?:\n\n    -vf scale=1920:-2\n    -vf scale=960:540:aspect..\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Time-lapse movie assembly",
    "version": "8.0",
    "project_urls": {
        "Homepage": "https://arne.delaat.net/timelapse.html",
        "Repository": "https://github.com/153957/time-lapse"
    },
    "split_keywords": [
        "ffmpeg",
        " photography",
        " time-lapse"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "90dd147014045641f809fc82e21ff35bbc90e0f89a0278bd362f3f742d748fda",
                "md5": "eca781951a65186011217dfde7518f33",
                "sha256": "d718a35d5faa3aba2a3593a72b8b5e06246f0fb72dbdbb1ccc8a170327505189"
            },
            "downloads": -1,
            "filename": "time_lapse-8.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "eca781951a65186011217dfde7518f33",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.13",
            "size": 51914,
            "upload_time": "2024-11-09T15:15:14",
            "upload_time_iso_8601": "2024-11-09T15:15:14.729860Z",
            "url": "https://files.pythonhosted.org/packages/90/dd/147014045641f809fc82e21ff35bbc90e0f89a0278bd362f3f742d748fda/time_lapse-8.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1cacd4032867f96a07f0d2085d86d8aa87e2ced611deb7b39c8a5183123b2d7e",
                "md5": "36c1a8e5a4f257b56acc98ece5b1ab32",
                "sha256": "cf3b78e76d169aac470df367d414c2332183fbe38213475379eabec51789ee28"
            },
            "downloads": -1,
            "filename": "time_lapse-8.0.tar.gz",
            "has_sig": false,
            "md5_digest": "36c1a8e5a4f257b56acc98ece5b1ab32",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.13",
            "size": 2438619,
            "upload_time": "2024-11-09T15:15:17",
            "upload_time_iso_8601": "2024-11-09T15:15:17.755866Z",
            "url": "https://files.pythonhosted.org/packages/1c/ac/d4032867f96a07f0d2085d86d8aa87e2ced611deb7b39c8a5183123b2d7e/time_lapse-8.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-09 15:15:17",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "153957",
    "github_project": "time-lapse",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "time-lapse"
}
        
Elapsed time: 0.80913s