Automatically process Zoom recordings to switch between speaker-only and side-by-side views based on screen sharing chapters
Project description
ZoomCutter
Automatically process Zoom recordings to switch between speaker-only and side-by-side views based on screen sharing chapters.
What it does
ZoomCutter intelligently combines your Zoom camera and screen sharing recordings into a single video that:
- Shows speaker-only view when you're not sharing your screen
- Switches to your chosen layout (side-by-side or diagonal) when screen sharing is detected
- Supports multiple layout options and custom backgrounds
- Maintains camera's native resolution for optimal performance
- Uses Zoom's built-in chapter markers to detect sharing automatically
Perfect for creating professional-looking recordings of presentations, lectures, or meetings!
Layout Examples
Side-by-Side Layout
50/50 split with slides on the left and camera on the right - perfect for balanced presentations.
Diagonal Layout
Large slides (~72% width) with a small camera overlay in the bottom-right corner - ideal for slide-heavy content.
Features
- Automatic switching: Reads Zoom chapter markers to detect when screen sharing starts/stops
- Smart resolution handling: Uses camera's native resolution by default (no unnecessary upscaling)
- Custom dimensions: Optional override to set specific output resolution (e.g., 1080p, 720p)
- Multiple layouts: Choose between side-by-side (50/50 split) or diagonal (large slides with small camera overlay)
- Custom backgrounds: Set background color or use custom background images
- Trim support: Cut your video to specific start/end times
- Fast processing: Optimized ffmpeg settings for quick encoding
- Dry-run mode: Preview the ffmpeg command before processing
Installation
pip install zoomcutter
Run without installing
uvx zoomcutter --help
Requirements
ZoomCutter requires ffmpeg to be installed on your system:
macOS:
brew install ffmpeg
Ubuntu/Debian:
sudo apt install ffmpeg
Windows: Download from ffmpeg.org or use Chocolatey:
choco install ffmpeg
Usage
Basic Usage
zoomcutter camera_file.mp4 slides_file.mp4 output.mp4
Where:
camera_file.mp4- Your Zoom camera recording (usually named*_avo_*.mp4)slides_file.mp4- Your Zoom screen sharing recording (usually named*_as_*.mp4)output.mp4- The output filename
Trim Video
Cut your video to a specific time range:
# Start at 2 minutes, end at 45 minutes
zoomcutter camera.mp4 slides.mp4 output.mp4 --start 00:02:00 --end 00:45:00
# Using short options
zoomcutter camera.mp4 slides.mp4 output.mp4 -ss 00:02:00 -to 00:45:00
Custom Output Dimensions
Set custom output dimensions instead of using the camera's native resolution:
# Output at 1080p (1920x1080) even if camera is 720p
zoomcutter camera.mp4 slides.mp4 output.mp4 --dimensions 1080p
# Or specify exact dimensions
zoomcutter camera.mp4 slides.mp4 output.mp4 -d 1920x1080
# Common presets: 1080p, 720p, 480p
# Or any custom WIDTHxHEIGHT format
Note: This will scale the video to the specified dimensions. Upscaling (e.g., 720p to 1080p) may reduce quality, while downscaling can reduce file size.
Dry Run
Preview the ffmpeg command without processing:
zoomcutter camera.mp4 slides.mp4 output.mp4 --dry-run
Layout Options
Choose between different layout modes for when screen sharing is active:
Side-by-Side Layout (default)
zoomcutter camera.mp4 slides.mp4 output.mp4 --layout side-by-side
# Or short form:
zoomcutter camera.mp4 slides.mp4 output.mp4 -l side-by-side
- 50/50 split: slides on left, camera on right
- Equal space for both elements
- Classic presentation layout
Diagonal Layout
zoomcutter camera.mp4 slides.mp4 output.mp4 --layout diagonal
# Or short form:
zoomcutter camera.mp4 slides.mp4 output.mp4 -l diagonal
- Large slides (~72% width) on the left
- Small camera overlay in bottom-right corner
- Minimal content overlap
- Great for slide-heavy presentations
Background Customization
Customize the background color or use a custom image:
Custom Background Color
# Use a named color
zoomcutter camera.mp4 slides.mp4 output.mp4 --background-color white
# Use a hex color
zoomcutter camera.mp4 slides.mp4 output.mp4 --background-color "#1E3A8A"
# Short form:
zoomcutter camera.mp4 slides.mp4 output.mp4 -bg "#FF5733"
Background Image
# Use a custom background image
zoomcutter camera.mp4 slides.mp4 output.mp4 --background-image /path/to/background.jpg
# Short form:
zoomcutter camera.mp4 slides.mp4 output.mp4 -bgi background.png
Combine Options
# Diagonal layout with custom background
zoomcutter camera.mp4 slides.mp4 output.mp4 \
--layout diagonal \
--background-color "#2C3E50" \
--start 00:05:00 \
--end 01:30:00
How It Works
- Reads chapter markers: ZoomCutter analyzes the screen sharing video file to find "Sharing Started" and "Sharing Stopped" chapter markers that Zoom automatically adds
- Detects camera resolution: Uses the camera feed's native resolution for optimal quality
- Builds filter: Creates an ffmpeg filter that:
- Shows camera at full resolution when not sharing (speaker-only mode)
- Switches to your chosen layout during sharing:
- Side-by-side: 50/50 split with slides on left, camera on right
- Diagonal: Large slides with small camera overlay in bottom-right
- Applies custom background colors or images if specified
- Processes video: Runs ffmpeg with optimized settings for fast, high-quality output
Output Quality
- Video codec: H.264 with CRF 18 (high quality)
- Preset: veryfast (good balance of speed and compression)
- Audio: Copied directly from camera feed (no re-encoding)
- Resolution: Matches camera's native resolution
Example
# Process a 1-hour Zoom recording
$ zoomcutter zoom_0.mp4 zoom_share.mp4 final.mp4
Processing Zoom recordings...
Camera: zoom_0.mp4
Slides: zoom_share.mp4
Output: final.mp4
Camera resolution: 1920x1080
Found 12 chapters
Found 3 screen sharing intervals:
1. 120.50s - 850.30s
2. 1200.00s - 2400.50s
3. 2800.00s - end
Output resolution: 1920x1080 (camera native)
- Speaker-only mode: No scaling (maximum performance!)
- Side-by-side mode: Only scales slides down
Running ffmpeg...
Successfully created: final.mp4
Troubleshooting
Error: "Could not detect camera resolution"
- Make sure the camera file is a valid video file
- Try running
ffprobe camera_file.mp4to verify
Error: "Error running ffprobe"
- Ensure ffmpeg (which includes ffprobe) is installed and in your PATH
No chapters found
- Verify you're using the screen sharing file (
*_as_*.mp4) for chapter detection - Some older Zoom versions may not include chapters
Development
Setup
git clone https://github.com/weltonrodrigo/zoomcutter.git
cd zoomcutter
uv pip install -e .
Run locally
python main.py camera.mp4 slides.mp4 output.mp4
License
MIT License - see LICENSE file for details
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zoomcutter-0.2.3.tar.gz.
File metadata
- Download URL: zoomcutter-0.2.3.tar.gz
- Upload date:
- Size: 12.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd1c6c348ab83bf3accb6ca1e77c7d3ee82003268019b9c4df300412c4ccd742
|
|
| MD5 |
2be6a63ce971951215aaf0204da8f866
|
|
| BLAKE2b-256 |
8ed3189738232c6d21de2d2ff9e589a3efceafbde4b30aa51caa63fd3b71a8de
|
Provenance
The following attestation bundles were made for zoomcutter-0.2.3.tar.gz:
Publisher:
publish.yml on weltonrodrigo/zoomcutter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zoomcutter-0.2.3.tar.gz -
Subject digest:
cd1c6c348ab83bf3accb6ca1e77c7d3ee82003268019b9c4df300412c4ccd742 - Sigstore transparency entry: 669120702
- Sigstore integration time:
-
Permalink:
weltonrodrigo/zoomcutter@24d7917ea3a01644073763850a5197a60647af4f -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/weltonrodrigo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@24d7917ea3a01644073763850a5197a60647af4f -
Trigger Event:
push
-
Statement type:
File details
Details for the file zoomcutter-0.2.3-py3-none-any.whl.
File metadata
- Download URL: zoomcutter-0.2.3-py3-none-any.whl
- Upload date:
- Size: 10.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
84dea738b002b0657fb90a4ecb3c842902340d24551f41e2f38c59221a97aeb7
|
|
| MD5 |
e08fa11c4c4e1166ef5d681a8e2f7140
|
|
| BLAKE2b-256 |
a970c23208099bd52f43c4f25302fa30694460aae191a6fa0115f5c1d1b636a0
|
Provenance
The following attestation bundles were made for zoomcutter-0.2.3-py3-none-any.whl:
Publisher:
publish.yml on weltonrodrigo/zoomcutter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zoomcutter-0.2.3-py3-none-any.whl -
Subject digest:
84dea738b002b0657fb90a4ecb3c842902340d24551f41e2f38c59221a97aeb7 - Sigstore transparency entry: 669120704
- Sigstore integration time:
-
Permalink:
weltonrodrigo/zoomcutter@24d7917ea3a01644073763850a5197a60647af4f -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/weltonrodrigo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@24d7917ea3a01644073763850a5197a60647af4f -
Trigger Event:
push
-
Statement type: