It’s time for the holidays and what better way to share love and memories with your family than to create an old-school, vintage movie? You don’t need a time-machine to go back to the 50s or 60s to rmake your homevideo look like a vintage movie. All you need is FFmpeg, some imagination, and perhaps the rest of this guide 🙂
Let’s take a look at how you can use FFmpeg to make your videos look like old-school/vintage/retro-styled movies, shall we?
What Do I Mean By A Vintage Movie?
Well, good question!
My definition of an old-school movie is a movie with a low frame-rate (like 15 fps), lots of scratches and film-grain to give an aged look, and a sepia tint to it!
Let’s see how we can achieve all of this using FFmpeg.
For this tutorial, I shall be using the “Touchdown Pass” sequence from Xiph to illustrate the steps. It’s a 20 second video, but for the sake of this tutorial, I’ll be cutting it to 10 seconds using FFmpeg (here’s how to do that).
Let’s get started!
Step 1: Changing the Frame Rate using FFmpeg
The first step is to “speed” up the video. Let’s take the video back to pre-30fps or pre-60fps days and take it all the way down to 10 fps. This gives the video an old-school look right off the bat!
ffmpeg.exe -i td-10sec.mp4 \
-filter:v fps=fps=10 \
td-fast.mp4
Here is the sped-up video.
Step 2: Give The Video a Vintage Look using FFmpeg’s filters
Next, let’s change the rich, wonderful colors and bring a sepia-link tint to the entire video. This can be done using FFmpeg’s in-built curves
filter. You can use the curves
filter to change the amount of R, G, B in a frame and specify the “curves” that govern the change or shift in colors.
Luckily for us, FFmpeg has a pre-defined vintage
filter that works pretty well, I must say! Here is the commandline to convert our sped-up video into a “vintage” looking video. Simple, right?
ffmpeg.exe -i td-fast.mp4 \
-vf curves=vintage \
td-vintage-fast.mp4
Here’s the result of the curves=vintage
filter on our footall video.
Step 3: Getting a Film Grain Overlay and Resizing It
As the final step, let’s add a lot of film-grain and “scratches” to make our video look like something that was shot on film, stored in a dusty old cupboard, and discovered 40 years later!
I found a fantastic “old school” film overlay on YouTube (source link) with a download link.
The video’s size is 1440x1080
pixels and so I had to resize it to 1920x1080
to match the size of my input video.
Here is the command to resize a video using FFmpeg using the the scale
filter. I’ve stored the output video as oldFilm1080.mp4
.
ffmpeg -i old-film-grain.wmv \
-vf scale=1920:1080,setsar=1:1 \
oldFilm1080.mp4
Step 4: Add the Overlay To Your Video
Now we have two videos with us –
- our old-school film-grain-scratchy video
- our vintage-looking, sped-up football video.
Now all that’s left to do is to overlay them on each other and enjoy the fruits of our FFmpeg’s labor!
Here’s the commandline to achieve that.
ffmpeg.exe \
-i oldFilm1080.mp4 \
-i td-vintage-fast.mp4 \
-filter_complex "[0]format=rgba,colorchannelmixer=aa=0.25[fg];\
[1][fg]overlay[out]" \
-map [out] \
-pix_fmt yuv420p -c:v libx264 -crf 18 \
touchdown-vintage.mp4
So, what’s going on here?
- we provide two input videos to FFmpeg
- using
filter_complex
, we usecolorchannelmixer
to overlay by modifying the alpha channel of the film-grain video that is referred to as[0]
and and let’s call the output[fg]
. It’s black and white, so modifying only the alpha is good enough for our use case. The syntax is as followscolorchannelmixer=rr:rg:rb:ra:gr:gg:gb:ga:br:bg:bb:ba:ar:ag:ab:aa
. - we are modifying only the alpha, and so, we modify only the
aa
(output’s alpha) to0.25
. - then, we use the vintage-looking football video (referred to as
[1]
) and overlay them both using theoverlay
filter to create an interim output stored in a variable called[out]
. This is shown in the commands –>[1][fg]overlay[out]
- then, we encode the interim output to give us the final video using H.264 with
crf=18
which should give us a good quality video.
Here is what the final output looks like! Cool, isn’t it?
And, here’s how it looks side-by-side the original video.
Now you can change the opacity of the alpha channels, use a different film grain video, or use a different curves
function, but, the process won’t change much.
Hope you all have a lot of fun making “vintage” videos this holiday season and please let me know in the comments how it went! Please create some fun videos, share them with your loved ones, and have a few laughs 🙂
Thank you!
If you enjoyed this post, do check out the rest of OTTVerse’s FFmpeg tutorials to learn more about how to use FFmpeg to improve your video editing, compression, and processing skills!
related articles

Krishna Rao Vijayanagar
Krishna Rao Vijayanagar, Ph.D. is the Editor-in-Chief of OTTVerse, a news portal covering technological and business news in the OTT space. With extensive experience in video compression, ABR streaming, video analytics, monetization, and more, Krishna has held multiple roles in R&D, Engineering, and Product ownership at companies such as Harmonic Inc., MediaMelon, and Airtel Digital. Krishna has published numerous articles and research papers on the latest trends in OTT and frequently speaks at industry events to share his insights and perspectives on the fundamentals and the future of OTT streaming.
Pingback: === popurls.com === popular today
Very Cool! – Very much enjoyed this and will have a lot of fun playing around – Thanks!!! KASH =)
Thanks, Kenny. I sure hope you end up creating a bunch of “vintage” home videos. I made one of my son riding his tricycle, and it looks so cool 🙂
Small typo in the command applying the overlay, references parkjoy-vintage-fast.mp4 but should be td-vintage-fast.mp4
Oops – fixed it. Thank you 🙂
You have three complete unnecessary decode + encode stages beforehand with implicit -crf 23 that waste a bit of quality each time (and a ton of CPU ressources) and then you try to get that to -crf 18.
You already mentioned filter graphs, so lets use them. Although the mentioned Old Film Grain movie is also available in 1920×1080, let’s assume its not. Then you command looks like that:
ffmpeg \
-i touchdown_pass_1080p.y4m \
-i Old\ FIlm\ Grain\ _\ Overlay\ \(Download\).mp4 \
-filter_complex “[0]fps=fps=10,curves=vintage[v0];\
[1]fps=fps=10,scale=1920:1080,setsar=1:1,format=rgba,colorchannelmixer=aa=0.25[fg];\
[v0][fg]overlay[out]” \
-map [out] \
-c:v libx264 -bf 16 -crf 30 -trellis 2 -direct-pred auto touchdown-vintage.mp4
Pingback: Für neue Macs: App-Downloader nutzt Cask-Katalog › ifun.de
ffmpeg -i E:\ffmpeg-test\input.mp4 -vf curves=vintage -y E:\ffmpeg-test\vintage_vid.mp4
This command run without any error, but the vintage effect not applied to output video and the output video all black. and also the output video is not playing.
Thank you for sharing this tutorial. However, I need to point out that your oldFilm video overlay will stop once it reached its end. The oldFilm overlay needs to play in a loop for the video effect to apply properly. Also, it would be nice for you to include the parameters to copy the audio too because the final video is silent.
Great idea – thanks for that !
why audio not playing..?