168 lines
3.9 KiB
Markdown
168 lines
3.9 KiB
Markdown
# movmaker
|
|
|
|
Simple Python + ffmpeg movie maker.
|
|
|
|
Drop pictures, videos, music, and optionally one simple `data.txt` file into a single flat input directory. Then run one command to create an MP4 video.
|
|
|
|
No YAML. No required subdirectories.
|
|
|
|
## Requirements
|
|
|
|
- Python 3
|
|
- `ffmpeg`
|
|
- `ffprobe` usually included with ffmpeg
|
|
|
|
Install on Debian/Ubuntu/Raspberry Pi OS:
|
|
|
|
```bash
|
|
sudo apt install ffmpeg
|
|
```
|
|
|
|
## Fonts
|
|
|
|
The default title/stamp styling uses these fonts:
|
|
|
|
- Bebas Neue for the opening title, date, and location
|
|
- Inter for the bottom-left/bottom-right stamps and per-file captions
|
|
|
|
Both fonts support common Danish and Croatian characters such as `æ ø å Æ Ø Å č ć ž š đ Č Ć Ž Š Đ`.
|
|
|
|
Install them locally for the current user:
|
|
|
|
```bash
|
|
mkdir -p ~/.local/share/fonts/google
|
|
curl -L -o ~/.local/share/fonts/google/BebasNeue-Regular.ttf \
|
|
'https://github.com/google/fonts/raw/main/ofl/bebasneue/BebasNeue-Regular.ttf'
|
|
curl -L -o ~/.local/share/fonts/google/Inter%5Bopsz,wght%5D.ttf \
|
|
'https://github.com/google/fonts/raw/main/ofl/inter/Inter%5Bopsz,wght%5D.ttf'
|
|
fc-cache -f ~/.local/share/fonts/google
|
|
```
|
|
|
|
Check that fonts are available:
|
|
|
|
```bash
|
|
fc-match 'Bebas Neue'
|
|
fc-match 'Inter'
|
|
```
|
|
|
|
## Input folder
|
|
|
|
Example:
|
|
|
|
```text
|
|
input/
|
|
IMG_001.jpg
|
|
IMG_002.png
|
|
holiday_clip.mp4
|
|
music.mp3
|
|
data.txt
|
|
```
|
|
|
|
Supported file types:
|
|
|
|
- Images: `.jpg`, `.jpeg`, `.png`, `.webp`, `.bmp`, `.tif`, `.tiff`
|
|
- Videos: `.mp4`, `.mov`, `.mkv`, `.avi`, `.webm`, `.m4v`
|
|
- Audio: `.mp3`, `.wav`, `.m4a`, `.aac`, `.flac`, `.ogg`
|
|
- Data: `data.txt`, `info.txt`, or `title.txt`
|
|
|
|
Files are ordered by filename, so names like this work well:
|
|
|
|
```text
|
|
001.jpg
|
|
002.jpg
|
|
003.mp4
|
|
004.jpg
|
|
```
|
|
|
|
## data.txt
|
|
|
|
`data.txt` is optional.
|
|
|
|
Simplest format:
|
|
|
|
```text
|
|
Paris Trip
|
|
Paris, France
|
|
May 2024
|
|
```
|
|
|
|
Those three lines mean:
|
|
|
|
1. title
|
|
2. location
|
|
3. date
|
|
|
|
If the date line is omitted, movmaker uses the date from the first picture/video and displays it like:
|
|
|
|
```text
|
|
May 14th 2026
|
|
```
|
|
|
|
Key/value format also works:
|
|
|
|
```text
|
|
title: Paris Trip
|
|
date: May 2024
|
|
place: Paris, France
|
|
```
|
|
|
|
Optional per-file captions are supported:
|
|
|
|
```text
|
|
IMG_001.jpg: Eiffel Tower
|
|
IMG_002.jpg: Louvre
|
|
IMG_003.jpg: First line | Second line
|
|
```
|
|
|
|
## Usage
|
|
|
|
Basic:
|
|
|
|
```bash
|
|
python3 movmaker.py input
|
|
```
|
|
|
|
With options:
|
|
|
|
```bash
|
|
python3 movmaker.py input \
|
|
--out-dir . \
|
|
--image-duration 6 \
|
|
--fade 3 \
|
|
--audio-fade 10 \
|
|
--audio-fade-in 2 \
|
|
--video-fade 1.5 \
|
|
--first-transition-at 12 \
|
|
--resolution 1920x1080 \
|
|
--fps 30
|
|
```
|
|
|
|
Fast preview render:
|
|
|
|
```bash
|
|
python3 movmaker.py input --preview
|
|
```
|
|
|
|
## Current behavior
|
|
|
|
- scans one flat input directory
|
|
- auto-detects media/audio/data files by extension
|
|
- shows each image fully visible for 6 seconds by default, not counting crossfades
|
|
- keeps the first image longer so the first transition starts at 12 seconds by default
|
|
- includes video clips inline
|
|
- crossfades between media items over 3 seconds by default
|
|
- loops/trims music to match the video
|
|
- fades music in over 2 seconds and out over 10 seconds by default
|
|
- fades video in/out over 1.5 seconds by default
|
|
- overlays the opening title for the first 6 seconds: large title, then date/location on one line
|
|
- displays optional per-file captions at bottom center; use `|` to split caption lines
|
|
- adds persistent bottom-left title/date/place and bottom-right `@bubulescu` stamps
|
|
- writes safe ASCII text in rendered overlays and metadata, so special letters become readable equivalents like `Č` -> `C`, `å` -> `a`, `ø` -> `o`
|
|
- embeds MP4 metadata: title, date, location, artist, comment, and creation_time
|
|
- writes an MP4 file named like `YYYYMMDD_title.mp4` in the current directory by default
|
|
- takes `YYYYMMDD` from the first picture/video metadata, falling back to file modification date
|
|
- uses local `ffmpeg/ffmpeg` and `ffmpeg/ffprobe` when present, otherwise system tools
|
|
|
|
## Notes
|
|
|
|
This is an early version. The intended workflow is deliberately simple: dump files into one folder and run the script.
|