zoomcutter


Namezoomcutter JSON
Version 0.2.2 PyPI version JSON
download
home_pageNone
SummaryAutomatically process Zoom recordings to switch between speaker-only and side-by-side views based on screen sharing chapters
upload_time2025-10-22 01:25:18
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseMIT
keywords zoom video processing ffmpeg screen-sharing presentation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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.

![Side-by-Side Layout Example](examples/screenshot-side-by-side.png)

### Diagonal Layout
Large slides (~72% width) with a small camera overlay in the bottom-right corner - ideal for slide-heavy content.

![Diagonal Layout Example](examples/screenshot-diagonal.png)

## 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

```bash
pip install zoomcutter
```

## Run without installing

```bash
uvx zoomcutter --help
```

### Requirements

ZoomCutter requires **ffmpeg** to be installed on your system:

**macOS:**
```bash
brew install ffmpeg
```

**Ubuntu/Debian:**
```bash
sudo apt install ffmpeg
```

**Windows:**
Download from [ffmpeg.org](https://ffmpeg.org/download.html) or use [Chocolatey](https://chocolatey.org/):
```bash
choco install ffmpeg
```

## Usage

### Basic Usage

```bash
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:

```bash
# 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:

```bash
# 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:

```bash
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)
```bash
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
```bash
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
```bash
# 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
```bash
# 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
```bash
# 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

1. **Reads chapter markers**: ZoomCutter analyzes the screen sharing video file to find "Sharing Started" and "Sharing Stopped" chapter markers that Zoom automatically adds
2. **Detects camera resolution**: Uses the camera feed's native resolution for optimal quality
3. **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
4. **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

```bash
# 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.mp4` to 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

```bash
git clone https://github.com/weltonrodrigo/zoomcutter.git
cd zoomcutter
uv pip install -e .
```

### Run locally

```bash
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.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "zoomcutter",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "zoom, video, processing, ffmpeg, screen-sharing, presentation",
    "author": null,
    "author_email": "Welton Rodrigo <rodrigo@familianascimento.org>",
    "download_url": "https://files.pythonhosted.org/packages/e8/63/4de8048f10b37fb8ab66f366b011a4a8bf29e44354fb1444cc1f6e2d2c3e/zoomcutter-0.2.2.tar.gz",
    "platform": null,
    "description": "# ZoomCutter\n\nAutomatically process Zoom recordings to switch between speaker-only and side-by-side views based on screen sharing chapters.\n\n## What it does\n\nZoomCutter intelligently combines your Zoom camera and screen sharing recordings into a single video that:\n- Shows **speaker-only view** when you're not sharing your screen\n- Switches to your chosen layout (side-by-side or diagonal) when screen sharing is detected\n- Supports multiple layout options and custom backgrounds\n- Maintains camera's native resolution for optimal performance\n- Uses Zoom's built-in chapter markers to detect sharing automatically\n\nPerfect for creating professional-looking recordings of presentations, lectures, or meetings!\n\n## Layout Examples\n\n### Side-by-Side Layout\n50/50 split with slides on the left and camera on the right - perfect for balanced presentations.\n\n![Side-by-Side Layout Example](examples/screenshot-side-by-side.png)\n\n### Diagonal Layout\nLarge slides (~72% width) with a small camera overlay in the bottom-right corner - ideal for slide-heavy content.\n\n![Diagonal Layout Example](examples/screenshot-diagonal.png)\n\n## Features\n\n- **Automatic switching**: Reads Zoom chapter markers to detect when screen sharing starts/stops\n- **Smart resolution handling**: Uses camera's native resolution by default (no unnecessary upscaling)\n- **Custom dimensions**: Optional override to set specific output resolution (e.g., 1080p, 720p)\n- **Multiple layouts**: Choose between side-by-side (50/50 split) or diagonal (large slides with small camera overlay)\n- **Custom backgrounds**: Set background color or use custom background images\n- **Trim support**: Cut your video to specific start/end times\n- **Fast processing**: Optimized ffmpeg settings for quick encoding\n- **Dry-run mode**: Preview the ffmpeg command before processing\n\n## Installation\n\n```bash\npip install zoomcutter\n```\n\n## Run without installing\n\n```bash\nuvx zoomcutter --help\n```\n\n### Requirements\n\nZoomCutter requires **ffmpeg** to be installed on your system:\n\n**macOS:**\n```bash\nbrew install ffmpeg\n```\n\n**Ubuntu/Debian:**\n```bash\nsudo apt install ffmpeg\n```\n\n**Windows:**\nDownload from [ffmpeg.org](https://ffmpeg.org/download.html) or use [Chocolatey](https://chocolatey.org/):\n```bash\nchoco install ffmpeg\n```\n\n## Usage\n\n### Basic Usage\n\n```bash\nzoomcutter camera_file.mp4 slides_file.mp4 output.mp4\n```\n\nWhere:\n- `camera_file.mp4` - Your Zoom camera recording (usually named `*_avo_*.mp4`)\n- `slides_file.mp4` - Your Zoom screen sharing recording (usually named `*_as_*.mp4`)\n- `output.mp4` - The output filename\n\n### Trim Video\n\nCut your video to a specific time range:\n\n```bash\n# Start at 2 minutes, end at 45 minutes\nzoomcutter camera.mp4 slides.mp4 output.mp4 --start 00:02:00 --end 00:45:00\n\n# Using short options\nzoomcutter camera.mp4 slides.mp4 output.mp4 -ss 00:02:00 -to 00:45:00\n```\n\n### Custom Output Dimensions\n\nSet custom output dimensions instead of using the camera's native resolution:\n\n```bash\n# Output at 1080p (1920x1080) even if camera is 720p\nzoomcutter camera.mp4 slides.mp4 output.mp4 --dimensions 1080p\n\n# Or specify exact dimensions\nzoomcutter camera.mp4 slides.mp4 output.mp4 -d 1920x1080\n\n# Common presets: 1080p, 720p, 480p\n# Or any custom WIDTHxHEIGHT format\n```\n\n**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.\n\n### Dry Run\n\nPreview the ffmpeg command without processing:\n\n```bash\nzoomcutter camera.mp4 slides.mp4 output.mp4 --dry-run\n```\n\n### Layout Options\n\nChoose between different layout modes for when screen sharing is active:\n\n#### Side-by-Side Layout (default)\n```bash\nzoomcutter camera.mp4 slides.mp4 output.mp4 --layout side-by-side\n# Or short form:\nzoomcutter camera.mp4 slides.mp4 output.mp4 -l side-by-side\n```\n- 50/50 split: slides on left, camera on right\n- Equal space for both elements\n- Classic presentation layout\n\n#### Diagonal Layout\n```bash\nzoomcutter camera.mp4 slides.mp4 output.mp4 --layout diagonal\n# Or short form:\nzoomcutter camera.mp4 slides.mp4 output.mp4 -l diagonal\n```\n- Large slides (~72% width) on the left\n- Small camera overlay in bottom-right corner\n- Minimal content overlap\n- Great for slide-heavy presentations\n\n### Background Customization\n\nCustomize the background color or use a custom image:\n\n#### Custom Background Color\n```bash\n# Use a named color\nzoomcutter camera.mp4 slides.mp4 output.mp4 --background-color white\n\n# Use a hex color\nzoomcutter camera.mp4 slides.mp4 output.mp4 --background-color \"#1E3A8A\"\n\n# Short form:\nzoomcutter camera.mp4 slides.mp4 output.mp4 -bg \"#FF5733\"\n```\n\n#### Background Image\n```bash\n# Use a custom background image\nzoomcutter camera.mp4 slides.mp4 output.mp4 --background-image /path/to/background.jpg\n\n# Short form:\nzoomcutter camera.mp4 slides.mp4 output.mp4 -bgi background.png\n```\n\n#### Combine Options\n```bash\n# Diagonal layout with custom background\nzoomcutter camera.mp4 slides.mp4 output.mp4 \\\n  --layout diagonal \\\n  --background-color \"#2C3E50\" \\\n  --start 00:05:00 \\\n  --end 01:30:00\n```\n\n## How It Works\n\n1. **Reads chapter markers**: ZoomCutter analyzes the screen sharing video file to find \"Sharing Started\" and \"Sharing Stopped\" chapter markers that Zoom automatically adds\n2. **Detects camera resolution**: Uses the camera feed's native resolution for optimal quality\n3. **Builds filter**: Creates an ffmpeg filter that:\n   - Shows camera at full resolution when not sharing (speaker-only mode)\n   - Switches to your chosen layout during sharing:\n     - **Side-by-side**: 50/50 split with slides on left, camera on right\n     - **Diagonal**: Large slides with small camera overlay in bottom-right\n   - Applies custom background colors or images if specified\n4. **Processes video**: Runs ffmpeg with optimized settings for fast, high-quality output\n\n## Output Quality\n\n- **Video codec**: H.264 with CRF 18 (high quality)\n- **Preset**: veryfast (good balance of speed and compression)\n- **Audio**: Copied directly from camera feed (no re-encoding)\n- **Resolution**: Matches camera's native resolution\n\n## Example\n\n```bash\n# Process a 1-hour Zoom recording\n$ zoomcutter zoom_0.mp4 zoom_share.mp4 final.mp4\n\nProcessing Zoom recordings...\n  Camera: zoom_0.mp4\n  Slides: zoom_share.mp4\n  Output: final.mp4\n\nCamera resolution: 1920x1080\n\nFound 12 chapters\nFound 3 screen sharing intervals:\n  1. 120.50s - 850.30s\n  2. 1200.00s - 2400.50s\n  3. 2800.00s - end\n\nOutput resolution: 1920x1080 (camera native)\n  - Speaker-only mode: No scaling (maximum performance!)\n  - Side-by-side mode: Only scales slides down\n\nRunning ffmpeg...\n\n\u0013 Successfully created: final.mp4\n```\n\n## Troubleshooting\n\n**Error: \"Could not detect camera resolution\"**\n- Make sure the camera file is a valid video file\n- Try running `ffprobe camera_file.mp4` to verify\n\n**Error: \"Error running ffprobe\"**\n- Ensure ffmpeg (which includes ffprobe) is installed and in your PATH\n\n**No chapters found**\n- Verify you're using the screen sharing file (`*_as_*.mp4`) for chapter detection\n- Some older Zoom versions may not include chapters\n\n## Development\n\n### Setup\n\n```bash\ngit clone https://github.com/weltonrodrigo/zoomcutter.git\ncd zoomcutter\nuv pip install -e .\n```\n\n### Run locally\n\n```bash\npython main.py camera.mp4 slides.mp4 output.mp4\n```\n\n## License\n\nMIT License - see LICENSE file for details\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Automatically process Zoom recordings to switch between speaker-only and side-by-side views based on screen sharing chapters",
    "version": "0.2.2",
    "project_urls": {
        "Homepage": "https://github.com/weltonrodrigo/zoomcutter",
        "Issues": "https://github.com/weltonrodrigo/zoomcutter/issues",
        "Repository": "https://github.com/weltonrodrigo/zoomcutter"
    },
    "split_keywords": [
        "zoom",
        " video",
        " processing",
        " ffmpeg",
        " screen-sharing",
        " presentation"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "55b87b55afee386b12530f11f9d11f02a3273a18f29ab9e5b912c5e59bf9bf42",
                "md5": "72ed9dfef694913480d8da2973d61348",
                "sha256": "8fb56b5e18839df3f3aa2f31a6030333c219e90eaecbd227efc97ecc7e6725e3"
            },
            "downloads": -1,
            "filename": "zoomcutter-0.2.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "72ed9dfef694913480d8da2973d61348",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 10231,
            "upload_time": "2025-10-22T01:25:16",
            "upload_time_iso_8601": "2025-10-22T01:25:16.735148Z",
            "url": "https://files.pythonhosted.org/packages/55/b8/7b55afee386b12530f11f9d11f02a3273a18f29ab9e5b912c5e59bf9bf42/zoomcutter-0.2.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e8634de8048f10b37fb8ab66f366b011a4a8bf29e44354fb1444cc1f6e2d2c3e",
                "md5": "810c058a2ffd9d318454e523e5c5162e",
                "sha256": "7b00ed0cda69b1887226d1d887a97ecf197b0a22a9493b91aa2ec5517f5a0d9c"
            },
            "downloads": -1,
            "filename": "zoomcutter-0.2.2.tar.gz",
            "has_sig": false,
            "md5_digest": "810c058a2ffd9d318454e523e5c5162e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 12220,
            "upload_time": "2025-10-22T01:25:18",
            "upload_time_iso_8601": "2025-10-22T01:25:18.019570Z",
            "url": "https://files.pythonhosted.org/packages/e8/63/4de8048f10b37fb8ab66f366b011a4a8bf29e44354fb1444cc1f6e2d2c3e/zoomcutter-0.2.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-22 01:25:18",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "weltonrodrigo",
    "github_project": "zoomcutter",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "zoomcutter"
}
        
Elapsed time: 4.32868s