π₯ sh2mp4
Records a shell command to an MP4 video, using xterm in a hidden desktop session.
This version is now written in Python. Use uvx sh2mp4 or pipx sh2mp4 to execute.
Usage
Record commands
# Basic recording
$ sh2mp4 "command to run" [output.mp4]
# With custom settings
$ sh2mp4 "htop" demo.mp4 --cols 120 --lines 40 --theme dark --font-size 14
# Live preview while recording
$ sh2mp4 "sl" train.mp4 --watch
Convert asciinema recordings
# Convert .cast files to MP4 (with window size optimization)
$ sh2mp4 --cast-file recording.cast output.mp4
# Fast conversion using speed multiplier (8x faster conversion time)
$ sh2mp4 --cast-file recording.cast output.mp4 --speed 8x
# Apply theme and font settings to cast conversion
$ sh2mp4 --cast-file demo.cast demo.mp4 --theme solarized-dark --font-size 16
# Watch the conversion in real-time
$ sh2mp4 --cast-file demo.cast demo.mp4 --watch
Utilities
# Check system dependencies
$ sh2mp4 --check-deps
# Measure available fonts and sizes
$ sh2mp4 --measure-fonts
Defaults
| arg | value | description |
|---|---|---|
| command | (required) | Command or script to run in recording |
| output | output.mp4 | Output file name |
| cols | $(tput cols) |
Terminal width in characters |
| lines | $(tput rows) |
Terminal height in characters |
| fps | 30 | Frames per second for recording |
| font | DejaVu Sans Mono | Font to use (must be monospace) |
| font-size | 12 | Font size in points (4,6,8,10,12,14,16,18,20) |
| theme | sh2mp4 | Terminal color theme |
| watch | False | Show live preview during recording |
| cast-file | None | Convert asciinema .cast file instead |
| speed | 1x | Speed multiplier for cast files (2x, 4x, 8x) |
Fonts
Font size is configurable (default 12pt). Character dimensions are automatically calculated based on the font size. Supported sizes: 4, 6, 8, 10, 12, 14, 16, 18, 20.
Run sh2mp4 --measure-fonts to see pixel dimensions for all available fonts and
sizes.
Themes
Available themes:
sh2mp4: Custom theme optimized for video recording (default)tango: Tango-based themedark: High-contrast dark themelight: Light themesolarized-dark: Solarized Dark theme
You can customize or add new themes in the src/sh2mp4/themes.py file.
Cast Conversion
The --speed option accelerates cast file conversion without affecting the final
video timing:
- β© Asciinema plays the cast file at accelerated speed (
--speed 8x) - π₯ FFmpeg records at higher frame rate (8x normal fps)
- π§ Video is automatically slowed back down to real-time during encoding
The cast file is also scanned for the maximum terminal dimensions, to prevent text wrapping.
# Convert a long recording quickly
$ sh2mp4 --cast-file long-session.cast output.mp4 --speed 8x
Dependencies
Run sh2mp4 --check-deps to see the full list of required system dependencies.
The main requirements are:
- π¬ ffmpeg (with libx264 support)
- πΌοΈ Xvfb (virtual framebuffer)
- π xterm (terminal emulator)
- πͺ openbox (window manager)
- βοΈ Various X11 utilities (wmctrl, xdotool, unclutter)
You might want to run this in a container due to the number of dependencies.
License
WTFPL with one additional clause:
- π Donβt blame me
Do wtf you want, but youβre on your own.
Links
See also
- πΊ tvmux - a tmux recorder using asciinema.