A simple, clean MP4 cutter and joiner with GUI — powered by ffmpeg and built with Python/tkinter.
- ✂ Cut Mode — Cut any video by setting a start and end time (precise to milliseconds)
- ⛓ Join Mode — Merge two video files, with optional re-encoding for a seamless join
- 💬 SRT Import Mode — Mux external subtitles into MP4/MKV without re-encoding
- 📐 Ratio Fix Mode — Fix wrong aspect ratio metadata in seconds — no re-encode
- 🎬 Video Preview — Live frame preview with timeline scrubber directly in the app
- ⌨ Keyframe Navigation — Jump between keyframes with ← → arrow keys
- 🖱 Click-to-Jump — Click anywhere on the timeline to jump to that position
- [ IN / OUT ] — Set cut points directly from the timeline, with silent validation (IN always < OUT)
- 🚫 Reset Buttons — Reset start/end times back to defaults with one click
- GPU Encoder Support — Choose between CPU (libx264), NVIDIA (h264_nvenc), AMD (h264_amf) or Intel QuickSync (h264_qsv)
- Inline Progress Bar — Percentage and elapsed time shown in the status bar — no popup window
- 🚫 Cancel Join — Button turns yellow during join and allows cancelling mid-process
- ⏮⏭ Prev/Next Navigation — Browse through all videos in the same folder with Prev/Next buttons
- 📂 Dynamic Path Labels — Long paths are automatically shortened, always showing the filename
- CRF Quality Slider — Control encode quality from 0 (lossless) to 51 (low)
- ✅ ffmpeg Status — Header shows ffmpeg status at a glance — click to set path manually
- Auto-detect ffmpeg — Prompts automatically on first start if ffmpeg is not found
- Window position memory — App reopens exactly where you left it
- Smart file naming — Output files are automatically named
_part01,_part02,_joined01etc. — no overwrites - Config persistence — All settings saved automatically next to the exe
| Field | Description |
|---|---|
| Source File | The video you want to cut |
| Output Folder | Where the cut file is saved |
| Timeline | Scrub through the video — click anywhere or drag |
| ← → | Jump between keyframes with arrow keys |
| [ Set IN | Sets start time to current timeline position (only if < OUT) |
| Set OUT ] | Sets end time to current timeline position (only if > IN) |
| 🚫 | Resets start to 00:00:00.000 / clears end time |
Time format: HH:MM:SS.mmm or plain seconds like 83.5
Output is saved as originalname_part01.mp4, _part02.mp4, etc.
- Select File 1 and File 2
- Optionally enable Re-Encode for a seamless join at the cut point
- Choose your encoder and adjust the CRF slider
- Hit JOIN FILES — output saves next to File 1 as
_joined01.mp4
| Encoder | Requires | Speed | Notes |
|---|---|---|---|
libx264 |
CPU only | Slow | Best compatibility, most accurate CRF |
h264_nvenc |
NVIDIA GPU | Very fast | Requires CUDA driver |
h264_amf |
AMD GPU | Very fast | Requires AMD drivers |
h264_qsv |
Intel GPU | Fast | Requires Intel drivers |
Note on GPU file size: GPU encoders need a higher CRF value (28–35) to produce similar file sizes as CPU at CRF 23. The quality difference is minimal — GPU encoders are simply more efficient per bit.
Mux an external subtitle file into a video container — no re-encoding, stream copy only.
- Select your MP4 source file
- Select the matching SRT subtitle file
- Choose a destination folder
- Configure track names and language codes for audio and subtitle streams
- Choose output format: MKV (recommended) or MP4
- Hit SRT MUXEN
| Setting | Description |
|---|---|
| Audio Track Name | Label shown in media players for the audio stream (e.g. DEU, English) |
| Audio Language | ISO language code embedded in the container metadata |
| Subtitle Track Name | Label for the subtitle track |
| Subtitle Language | ISO language code for the subtitle stream |
| Output Format | MKV supports SRT natively; MP4 converts to mov_text |
Output is saved as originalname_muxed.mkv (or .mp4) in the selected folder.
All track settings are saved automatically and restored on next launch.
Fix a wrong aspect ratio flag in the video container — no re-encoding, only the header metadata is rewritten. The video data itself is untouched.
- Load a source file via the file panel
- Select the target aspect ratio from the dropdown
- The preview updates live — showing exactly how the video will look with the new ratio (letterbox / pillarbox simulation)
- Hit FIX ASPECT RATIO — the button only activates once a ratio is selected and a file is loaded
| Preset | Ratio | Use case |
|---|---|---|
| Standard HD/4K | 16:9 | Most modern video |
| SD / old formats | 4:3 | Legacy TV, older cameras |
| Ultrawide | 21:9 | Widescreen monitors |
| Cinemascope | 2.35:1 (235:100) | Cinema anamorphic |
| Cinemascope | 2.39:1 (239:100) | Cinema anamorphic (DCI) |
| Flat | 1.85:1 (185:100) | Cinema flat |
| Square | 1:1 | Instagram, social media |
| Portrait | 9:16 | Mobile, TikTok, Reels |
| Custom | any X:Y | Free input, e.g. 178:100 |
Output is saved as originalname_arfix01.mp4, _arfix02.mp4, etc.
| Key | Action |
|---|---|
| H | Show shortcuts |
| F1 | Switch to Cut mode |
| F2 | Switch to Join mode |
| F3 | Switch to SRT Import mode |
| F4 | Switch to Ratio Fix mode |
| F5 | Cut & Save |
| F6 | Join Files |
| F7 | Fix Aspect Ratio |
| F8 | Mux SRT |
| S | Browse source file (Cut mode) |
| O | Browse output folder (Cut mode) |
| ← → | Jump 1 keyframe |
| Ctrl + ← → | Jump 10 keyframes |
| Home | Set IN point |
| End | Set OUT point |
| PgUp / PgDn | Previous / Next file in folder |
| 1 / 2 | Open File 1 / File 2 (Join mode) |
| R | Toggle Re-Encode (Join mode) |
| E | Focus encoder dropdown (Join mode) |
| Q | Focus CRF slider (Join mode) |
The ffmpeg confirmed label in the top-right of the header shows whether ffmpeg is available.
Click it to manually select your ffmpeg.exe.
Auto-detect search order:
- Manually set path
- System
PATH C:\ffmpeg\bin\ffmpeg.exeC:\Program Files\ffmpeg\bin\ffmpeg.exeC:\Program Files (x86)\ffmpeg\bin\ffmpeg.exe
| Version | Feature |
|---|---|
| ✅v1.0 | Basic cut & join GUI |
| ✅v1.1 | GPU encoder support, live progress window, English UI |
| ✅v1.2 | Video preview, timeline scrubber, IN/OUT markers, keyframe navigation |
| ✅v1.3 | Click-to-jump on timeline, ffmpeg auto-prompt on first start |
| ✅v1.4 | Window position memory, reset buttons for start/end time |
| ✅v1.5 | New warm light blue/orange theme — easier on the eyes |
| ✅v1.6 | Inline progress bar, cancel join button, log file, layout & UX polish |
| ✅v1.7 | Fix terminal window flashing on Windows, disable logging |
| ✅v1.8 | Prev/Next file navigation, dynamic path labels, smaller buttons, new scissors icon |
| ✅v1.9 | Compact layout, START/END inline with time fields, clean marker labels |
| ✅v2.0 | Final UI modification |
| ✅v2.1 | Added SRT Import mode: mux external subtitles into MP4/MKV without re-encoding |
| ✅v2.2 | Live aspect ratio preview in Ratio Fix mode (letterbox / pillarbox simulation), color-coded mode button bar |
| ✅v2.3 | Shortcuts help (H key), olive color scheme, dynamic window height, fixed window width across all modes |
| 🔜v3.0 | Fine-tune cut mode — frame-accurate cut point selection |
| 🔜v4.0 | Linux & Mac compatibility |
SimpleMp4Cutter/
├── mp4_cutter.py # Main application
├── icon.ico # App icon
├── README.md # This file
├── .gitattributes # GitHub language detection fix
├── .gitignore # Git ignore rules
└── LICENSE # MIT License
mp4cutter.logandmp4cutter_config.jsonare created automatically next to the exe and are excluded from git.
MIT License — free to use, modify and share.
Built with ❤️ and ffmpeg