I am always sharing clips and videos with my friends and often times the file size is ridiculously large to send over most social media (Discord, Twitter, Telegram, etc). To get around these massive file sizes, I use ffmpeg to compress the video. FFMPEG is a super powerful tool for all your media processing. It has a ton of libraries for handling different tasks involving visual and audio media.
Using ffmpeg we are able to compress videos down by ~10x. For example, if we have a 1 minute and 15 second clip that is 1080p 60fps @ 432Mb, we can use a simple one-line ffmpeg command to compress this video down to ~50Mb. This now allows us to send it on a lot of different platforms way easier.
All the while, we lose little to no quality in the video. This is a great solution but it can be a serious hassle to have to open your terminal every time you want to compress these videos. I thought it would be easier to simply make a right-click menu item to quickly compress videos. I've tested it with m4v, mkv, and mp4 videos and it works flawlessly.
Normally you could just run:
ffmpeg -i INPUT_FILE.mp4 -vcodec h264 -acodec aac OUTPUT.mp4
but nobody wants to have to type this out every time. Since I already had an FFMPEG python compression script laying around I used that as the main program to be run.
You need a couple of tools to start. First, get Python 3 (preferably above 3.5). Make sure you have Python3 installed to your PATH as well. See how here..
scoop install ffmpeg
Make sure your scoop shims are in your PATH! (C:\Users<YOU>
scoop\shims is the default path)
Now you're ready to start compressing!
Making our script and right-click registry file
Starting out you can make a
compress.py file and place it any where. I placed it in
C:\Users\Max\ffmpeg-compress\compress.py. The contents of that file are as follows:
import sys from subprocess import run, PIPE from pathlib import Path args = sys.argv[1:] video_file = Path(' '.join(args)) run(['ffmpeg', '-i', video_file.name, '-vcodec', 'h264', '-acodec','aac', video_file.name.replace('.' + video_file.name.split('.')[-1], '-compressed.' + video_file.name.split('.')[-1])])
Going line by line:
1-3: Importing our modules.
sys to get our arguments,
subprocess in order to call our command and get the output, and
pathlib to parse and clean up our path strings.
args is a list of arguments passed when calling the executable (this will be our filename)
video_file is a Path object with the args passed joined as a string
run([...]) is where we call the
ffmpeg executable from Python and run our command to compress.
Next, you need to make a
.bat file anywhere on your computer. I placed mine @
C:\Users\Max\compress.bat. The contents of that file are:
@echo OFF SET subject=%* for %%a in (%*) do set subject=%%a python C:\\Users\\Max\\ffmpeg-compress\\compress.py %subject%
Going line by line:
@echo OFF disables the printing of each line in the batch script to the terminal. A standard in batch scripts.
2-3: Will set all of our arguments to a variable
4: Calls our python script with the video as our argument.
Finally, we need to make a file called
ffmpeg-compress.reg anywhere. We can use Notepad to do so. In this file, paste the following but replace the filepath for
compress.bat with yours.
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\ffmpeg-compress] @="Compress File w/ FFMPEG" [HKEY_CLASSES_ROOT\*\shell\ffmpeg-compress\command] @="\"C:\\Users\\Max\\compress.bat\" \"%1\""
Going section by section:
[HKEY_CLASSES_ROOT\*\shell\ffmpeg-compress], we are setting the title of our right-click menu button.
[HKEY_CLASSES_ROOT\*\shell\ffmpeg-compress\command], we are setting the actual command string we want the button to run when clicked.
Now when we right-click on a file, we have the option to
Compress w/ FFMPEG
This will now allows us to easily compress videos without having to open the terminal.
A gist is available with the files used in this here:
Why are you using Python? Couldn't you do this in pure batch?
I suck with batch and I really don't like having to deal with weirdness passing args and parsing them. Python is just a more comfortable language for me. I'm also able to do string replacing and what not easier, and I already had the Python file
Top comments (2)
Nice - you wrote a super concise tutorial and it works perfectly. Please Keep posting!
You also suck with Python - not just Batch. You could have done it in Python without any Batch. :-)
But thank you for the post! It was an interesting introduction to ffmpeg for dev.