superimposer


Namesuperimposer JSON
Version 0.1.3 PyPI version JSON
download
home_pageNone
SummarySuperimpose presentation records onto PDF slides
upload_time2025-09-10 14:47:46
maintainerJon Gjengset
docs_urlNone
authorJon Gjengset
requires_python>=3.9
licenseNone
keywords presentation slides video ffmpeg
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Superimposer — combine presentation videos with slides

**You have**: pdf slides and a video of you talking about them.

**You want**: a video of your slides with you in the corner.

**You need**: superimposer.

So, you presented something, and now have a recording of it, that's
awesome! But the slides are hard to read, or got cropped out somehow,
and you want to fix that. Fear not, superimposer has you covered! Just
tell it what slide to display when, point it at your slides and your
video, and it will generate a new video for you with the slides front
and center, and your video tucked away nicely in a corner.

To get up and running, you first need the video file for your
presentation (let's say it's `presentation.mp4`) and a PDF file with
your slides (let's say it's `slides.pdf`). Then, create a file called
`transitions.txt` and write:

```
00:00 1
```

You probably get the gist here. Play through your presentation, and
every time you change slides, write down a new line with the current
timestamp (the `O` hotkey in `mpv` is handy here) and the desired slide
number. When you're done, run:

```console
$ superimposer presentation.mp4 slides.pdf superimposed.mp4
```

This will eventually kick off `ffmpeg`, which will take a while to
encode your video. When it's done, `superimposed.mp4` should have what
you want!

Superimposer takes a bunch of handy command-line arguments to tweak the
output. Run `superimposer --help` to see them. If you're using H.264,
you may want to consider also giving:

```console
-- -tune stillimage
```

If you are significantly resizing the camera video, you may want to
[change the scaling algorithm](https://superuser.com/a/375726/77846)
with:

```console
-- -sws_flags lanczos
```

## Requirements

 - `ffmpeg` and `ffprobe` (usually installed with [`ffmpeg`](https://ffmpeg.org/))
 - `pdftoppm` (part of [Poppler](https://poppler.freedesktop.org/))

## Normalizing audio

If your audio is sad, try [`ffmpeg-normalizer`] with something like:

```console
$ ffmpeg-normalize superimposed.mp4 -o superimposed-normalized.mp4 -c:a aac
```

## Hardware acceleration

You can pass additional parameters to the ffmpeg encoder by placing them
after `--` in the argument list to `superimposer`. You'll probably want
to read up on [hardware acceleration in ffmpeg], and maybe the [ffmpeg
VAAPI encoding docs].

## Examples

Here are some examples of what the resulting video looks like:

[![Demystifying unsafe code](https://img.youtube.com/vi/QAz-maaH0KM/sddefault.jpg)](https://www.youtube.com/watch?v=QAz-maaH0KM)
[![Considering Rust](https://img.youtube.com/vi/DnT-LUQgc7s/sddefault.jpg)](https://www.youtube.com/watch?v=DnT-LUQgc7s)

  [hardware acceleration in ffmpeg]: https://trac.ffmpeg.org/wiki/HWAccelIntro
  [ffmpeg VAAPI encoding docs]: https://trac.ffmpeg.org/wiki/Hardware/VAAPI#Encoding
  [`ffmpeg-normalizer`]: https://github.com/slhck/ffmpeg-normalize

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "superimposer",
    "maintainer": "Jon Gjengset",
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "Jon Gjengset <jon@thesquareplanet.com>",
    "keywords": "presentation, slides, video, ffmpeg",
    "author": "Jon Gjengset",
    "author_email": "Jon Gjengset <jon@thesquareplanet.com>",
    "download_url": "https://files.pythonhosted.org/packages/4d/f2/175b87ebc4229ebad75f264724e92675260ed5aceceafca546914b1825fc/superimposer-0.1.3.tar.gz",
    "platform": null,
    "description": "# Superimposer \u2014 combine presentation videos with slides\n\n**You have**: pdf slides and a video of you talking about them.\n\n**You want**: a video of your slides with you in the corner.\n\n**You need**: superimposer.\n\nSo, you presented something, and now have a recording of it, that's\nawesome! But the slides are hard to read, or got cropped out somehow,\nand you want to fix that. Fear not, superimposer has you covered! Just\ntell it what slide to display when, point it at your slides and your\nvideo, and it will generate a new video for you with the slides front\nand center, and your video tucked away nicely in a corner.\n\nTo get up and running, you first need the video file for your\npresentation (let's say it's `presentation.mp4`) and a PDF file with\nyour slides (let's say it's `slides.pdf`). Then, create a file called\n`transitions.txt` and write:\n\n```\n00:00 1\n```\n\nYou probably get the gist here. Play through your presentation, and\nevery time you change slides, write down a new line with the current\ntimestamp (the `O` hotkey in `mpv` is handy here) and the desired slide\nnumber. When you're done, run:\n\n```console\n$ superimposer presentation.mp4 slides.pdf superimposed.mp4\n```\n\nThis will eventually kick off `ffmpeg`, which will take a while to\nencode your video. When it's done, `superimposed.mp4` should have what\nyou want!\n\nSuperimposer takes a bunch of handy command-line arguments to tweak the\noutput. Run `superimposer --help` to see them. If you're using H.264,\nyou may want to consider also giving:\n\n```console\n-- -tune stillimage\n```\n\nIf you are significantly resizing the camera video, you may want to\n[change the scaling algorithm](https://superuser.com/a/375726/77846)\nwith:\n\n```console\n-- -sws_flags lanczos\n```\n\n## Requirements\n\n - `ffmpeg` and `ffprobe` (usually installed with [`ffmpeg`](https://ffmpeg.org/))\n - `pdftoppm` (part of [Poppler](https://poppler.freedesktop.org/))\n\n## Normalizing audio\n\nIf your audio is sad, try [`ffmpeg-normalizer`] with something like:\n\n```console\n$ ffmpeg-normalize superimposed.mp4 -o superimposed-normalized.mp4 -c:a aac\n```\n\n## Hardware acceleration\n\nYou can pass additional parameters to the ffmpeg encoder by placing them\nafter `--` in the argument list to `superimposer`. You'll probably want\nto read up on [hardware acceleration in ffmpeg], and maybe the [ffmpeg\nVAAPI encoding docs].\n\n## Examples\n\nHere are some examples of what the resulting video looks like:\n\n[![Demystifying unsafe code](https://img.youtube.com/vi/QAz-maaH0KM/sddefault.jpg)](https://www.youtube.com/watch?v=QAz-maaH0KM)\n[![Considering Rust](https://img.youtube.com/vi/DnT-LUQgc7s/sddefault.jpg)](https://www.youtube.com/watch?v=DnT-LUQgc7s)\n\n  [hardware acceleration in ffmpeg]: https://trac.ffmpeg.org/wiki/HWAccelIntro\n  [ffmpeg VAAPI encoding docs]: https://trac.ffmpeg.org/wiki/Hardware/VAAPI#Encoding\n  [`ffmpeg-normalizer`]: https://github.com/slhck/ffmpeg-normalize\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Superimpose presentation records onto PDF slides",
    "version": "0.1.3",
    "project_urls": {
        "funding": "https://github.com/sponsors/jonhoo/",
        "homepage": "https://github.com/jonhoo/superimposer",
        "issues": "https://github.com/jonhoo/superimposer/issues"
    },
    "split_keywords": [
        "presentation",
        " slides",
        " video",
        " ffmpeg"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7cde2223e7342f14351bfff6339cd184b757643b21ded5a4ff01d6f3e4e18f63",
                "md5": "28f45de1ee6b8737a978616d81813c64",
                "sha256": "c65d5fdf118f82d16d44cf9791a5f7413877e7d144028ef11adfa399edd2f818"
            },
            "downloads": -1,
            "filename": "superimposer-0.1.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "28f45de1ee6b8737a978616d81813c64",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 6128,
            "upload_time": "2025-09-10T14:47:45",
            "upload_time_iso_8601": "2025-09-10T14:47:45.806088Z",
            "url": "https://files.pythonhosted.org/packages/7c/de/2223e7342f14351bfff6339cd184b757643b21ded5a4ff01d6f3e4e18f63/superimposer-0.1.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4df2175b87ebc4229ebad75f264724e92675260ed5aceceafca546914b1825fc",
                "md5": "b5c387436ad0422120c1d0ab7e5897ca",
                "sha256": "d9102e7ad318b3a48fe5b03b9e7372c4a6c8f1091378c8d0c4adf16ffc0ce735"
            },
            "downloads": -1,
            "filename": "superimposer-0.1.3.tar.gz",
            "has_sig": false,
            "md5_digest": "b5c387436ad0422120c1d0ab7e5897ca",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 5316,
            "upload_time": "2025-09-10T14:47:46",
            "upload_time_iso_8601": "2025-09-10T14:47:46.740570Z",
            "url": "https://files.pythonhosted.org/packages/4d/f2/175b87ebc4229ebad75f264724e92675260ed5aceceafca546914b1825fc/superimposer-0.1.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-10 14:47:46",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "sponsors",
    "github_project": "jonhoo",
    "github_not_found": true,
    "lcname": "superimposer"
}
        
Elapsed time: 0.53820s