Image from Pexels ( NC )
OverviewI made this blog post begineer friendly as much as possible and took a lot of time to explain and write things with real world practical examples.
In this blog post, we will get to know about ffmpeg which is a popular cli tool to process multimedia files. Command-line is much faster and easier if you get familiar with it. You can start using Linux. Take a look at my Linux Basics post if you want to. You can do almost what you need easier and more faster. We all came across using some 3rd party GUI software to convert video files, trim them, trim audio files, resize image files. What If I tell you can do them in just few seconds without relying on any web service and hard steps.
FFMPEG
As I've mentioned eariler, we are going to use ffmpeg to do this. You can get ffmpeg from their Offical download page or if you're using Linux. Then you can install it by your desired package manager. Most commands works regardless of OS/Environment. But, some of the commands need to be executed on specific OS/Environment. I will try to mention the alternative method if possible. Now, you've got a basic view on what's ffmpeg. Let's jump on to some use cases and how to use it.
How to use it ( Basics )
Understanding the syntax and basic arguments
ffmpeg takes 2 important arguments. -i and output . Where it process or converts the file to another format. The example usage would look like this.
Bash:
ffmpeg -i {input_file} {output_file}
1. Converting Video files
This is same in all environment. But, you have to replace
ffmpeg
with ffmpeg.exe
if you're using Windows.As I've mentioned eariler. We are going to give it the input file and the output file name.
Bash:
ffmpeg -i "Memorable Moment.avi" "Memories.mp4"
Example Use Cases
1.1. Converting Big Avi Files to Mp4 to save space
Conversion of an avi file to mp4. Reduced almost 1.795 GB.
Not just avi to mp4. You can do alot of conversion type. You can check their about or website to check the supported file types. You don't have to configure through GUI screens to change the format to export or convert to. Just specify the file extension and the tool will take care of it.
1.2. Converting video files/song to mp3
Yea, I can hear you want to convert video files to audio format to play them in background or in a audio player to save space and lesser file size. You can do that too.
Bash:
ffmpeg -i "The Score Unstoppable.mp4" "Unstoppable.mp3"
2. Converting Image files
As you already know. We can specify input as an image file and then output to other image file format.
Bash:
ffmpeg -i sample.webp output.png
Example Use Cases
2.1. Resizing Image for profile or to meet requirement.
In some websites, you need to upload images in the required size like a profile in your document must be in the pixel size they provide.
Syntax :
Bash:
ffmpeg -i {input} -vf scale={width}:{height} {output}
2.1.1 Custom values ( doesn't preserve aspect ratio )
To show how it looks, I converted the High quality SupremeGamers logo to 40x40. This would work if the input image is a perfect square. If it is not, then you can use the next method for that.
Bash:
ffmpeg -i SG_logo.png -vf scale=40:40 converted.png
Output :
SG_logo.png is the original hq file. As you can see, converted.png is stretched a bit horizontally.
Here, it becomes more handy. You can specify -1 in height or either width to make it adjusting to the value you provided. If you use 50:-1. It will get the calculate the height by itself using the aspect ratio of the image. -1:100 do the same since you understood how it works. -1 gets the value according to the aspect ratio.
Bash:
ffmpeg -i SG_logo.png -vf scale=40:-1 converted_preserve.png
Output :
You can see now the converted_preserve.png is identical to the Original one. It's not streched like the previous one. It preserves the aspect ratio.
Like TIFF files are larger in size. You can convert them to save space in your disk. Meanwhile JPEG is the lightest one. You can use ffmpeg to do that easily. Some un-popular file formats will not be supported on some sites/apps. You can convert them to png or jpg to make them work.
3. Audio
The same things goes for audio. File input and file output if you want to convert. I'll tell you the ad steps to trim, crop, batch convert them later on.
3.1 Changing Audio Bitrate ( quality )
Syntax:
-ab followed by space and audio bitrate
Bash:
ffmpeg -i "blackbear my worst Lyrics.mp3" -ab 64 low_quality.mp3
Output:
First file is the original mp3 and the second one is converted.
In this part we'll cover about batch convert, trimming, cropping specific clip or audio from video and audio files. The syntax might get harder. It's better to know about bash for the loop part.
1. Batch/Bulk Convert [ Linux ]
We can use bash loop or find to do this. Follow the syntax and commands carefully to understand. Before going to that. You can get some information on what we're going to use.
Understanding Wildcards ( * ) :
Wild cards are like auto fill. Here we use ( * ) star wildcard. Basically you can call it everything. If you input
*.mp4
, As we've mentioned before *.mp4
. It will fetch all the files ending with .mp4. Same goes for all. We can use this to filter through file types or file names. Like if you have images from a Professional camera and just want to convert that. You can specify DSC_ to copy files start with DSC. And If you want to check both sides. You can use a syntax like this Blackbear-*.mp4 to get all the files named in this format.. e.g Blackbear-IDFC.mp4, Blackbear-Myworst.mp4. I hope you can understand the concept behind this. Don't worry if you can't. You can read it again to better understand.Loops ( for ) :
In bash and some other shells. There is for loop to do a task for every entry/name. We can use wildcards to make it more powerful.
Variables :
In programming and scripting. We can use variable to define a value and get it later on. Eg. if you use
Code:
name="Jack"
Example Use case
We have a folder named "Songs" where we have files filled with mkv and mp4 files and some mp3 files too. Now, we want to just conver the mp4 files to mp3 in the Mp3 folder. Can we do that? Yes, We can use wildcard to filter mp4 files and use loops to batch operate them. Let's get started.
Doesn't it looks hard to do manually. We got you covered. I know most people don't organize things. But, we can still filter out and convert.
1.1 Using Loop
Syntax:
Bash:
for file in *.mp4;do ffmpeg -i "$file" "Mp3/${file//.mp4}.mp3";done
Dance Monkey.mp4.mp3, Dua Lipa Levitating.mp4.mp3 which doesn't look great.
When being processed, the command will look like this to the computer.
Bash:
ffmpeg -i "Dance Monkey.mp4" "Mp3/Dance Monkey.mp3"
Output :
I stopped converting at 7th file. This will take some time like 10 or 15 minutes according to the files and the video size.
Output of ls. Files present in Mp3 folder. You can see the naming is not affected and looks normal.
This isn't just limited to video files. You can replace the wildcard *.mp4 to any other file type that you want to batch convert and same goes for the substitution and the output file name appending. If you want some example.
Code for converting webp files to png in a folder called "Png"
Bash:
for file in *.webp;do ffmpeg -i "$file" "Png/${file//.webp}.png";done
Code for png files to ico by 100xauto for using as icons ( Output to "Icons" )
This example is useful when you want to set custom icon files for apps and folders. Give it a try.
Bash:
for file in *.png;do ffmpeg -i "$file" -vf scale=100:-1 "Icons/${file//.png}.ico";done
1.2 Using find ( binary ) :
find is a linux binary which is available to use in every linux distro. You can use this if you don't want to learn about loops, variables, wildcards and things. Keep everything as simple and use find to do the work.
Bash:
find . -exec ffmpeg -i {} {}.mp3\;
2. Trimming Video/Audio files
This will look like a bit advanced. A hard thing which can be done like a piece of cake. Yes, I assume that you've used some paid/3rd party GUI multimedia tool to trim/crop video/audio files. You can do that simply in seconds and just in a line of command. Let's get started.
2.1 Trimming
Have a video/audio which has unwanted or useless things in the ending. You can convert the first part of the video/audio without the unwanted part.
Syntax:
-t followed by time stamp. ( eg. 1:00 or 0:30 etc.,. )
Example use case
I have a video named Color BG.mp4 and I want to get the first 30 seconds of the video and save as another file. We are going to do that.
Video that we are going to trim. Duration is 3:00 ( 3 mins ).
Bash:
ffmpeg -i "Color BG.mp4" -t 0:30 output.mp4
Output :
Converted Video file. Duration 00:30 ( 30 seconds ).
2.2 Cropping Specific clip/sound ( e.g 1:10 to 3:30 ) etc.,.
Want to crop a meme you like from a Meme compilation video? Yes, you can do that. But, we need to use a video player as a preview panel in video editor to get the time stamps.
Syntax :
-ss followed by start time stamp -to followed by end time stamp.
Bash:
ffmpeg -i "video.mp4" -ss 1:10 -to 3:30 meme.mp4
Example Use case
We are now going to cut out a meme video from a meme compilation video so we can share on social media.
I want to trim this dog meme for example. It starts on 3:50 and ends on 4:09. You need to note the start and end time stamps.
Bash:
ffmpeg -i "Meme Comp.mp4" -ss 03:50 -to 04:09 "Dog Meme.mp4"
Output :
Now, I got the dog meme video from the whole meme compilation. So, I can share them on social media.
Requested to add by @Xtr . We can extract frames from the video to get sequence of image files. This will become handy if you want to create boot animations or get a specific clicks from a video.
Syntax:
Bash:
ffmpeg -i {input} -vf fps={fps} %0{digits}_output
Note :
fps mentioned above is optional and you can remove that part. Mostly, boot animations are 24 frames and they will work better. digits is the file name sequence. Image sequences need to be in a format that they must be sort by A-Z format and will be read by the computer in that format. So, the longer the video, the higher the digits should.
%06d.png
The above argument will generate images like this. 000001.png, 000002.png, 000003.png etc.,. Since you know how this works. Don't worry. You can still specify file names and output folder before the name. The %d is an actual variable like parameter and can be inside a string.
Output/Frame_%04d.png
The above argument will generate images like Frame_0001.png, Frame_0002.png, Frame_0004.png etc.,. inside Output folder. So, you can consider it as a variable and use feel free to work with filenames. But, here we are going to use simple digits and we're going to store them in a separate folder to create a boot animation.
Usage :
Now, I want to extract frames from a video called Render.mp4 in 24 fps and in the sequence of 4 digit numbers and specifically save them inside a folder called Frames. Shall we move.
Bash:
ffmpeg -i Render.mp4 -vf fps=24 Frames/%04d.png
Output :
Image sequence saved in a seperate folder. The file names follow the digits.
Extra Info
1. My Opinion :
When I was new to Linux. I wish I knew them. I used some online services to the do this above things without knowing that we can do all of them from our commandline in seconds. It's up to you to use this or other software or online services. You can pretty much do things easily if you get familiar with command line.
It took me alot of time to manage things. Write them, order them, organize them, execute code and upload screenshot to make the fully understandable.
2. Is it free?
It's FOSS ( Free and Open Source ). You don't have to buy it. You can use it freely and see how it's developed and you can contribute if you can.
3. Why this blog post?
I just wanted to share my thoughts and things I do. So, people who faced things like me can use this to save their time. If you see any grammatical mistakes or code erros or doubts. Feel free to post a reply and I will try to reply you as soon as possible.
Last edited: