Create Vintage Videos Using FFmpeg in 4 Simple Steps

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 \

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 \

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 \

Step 4: Add the Overlay To Your Video

Now we have two videos with us –

  1. our old-school film-grain-scratchy video
  2. our vintage-looking, sped-up football video.
Related:  VMAF in FFmpeg - Installation and Usage Guide for Ubuntu

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 \

So, what’s going on here?

  • we provide two input videos to FFmpeg
  • using filter_complex, we use colorchannelmixer 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 follows colorchannelmixer=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) to 0.25.
  • then, we use the vintage-looking football video (referred to as [1]) and overlay them both using the overlay 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!

krishna rao vijayanagar
Krishna Rao Vijayanagar

I’m Dr. Krishna Rao Vijayanagar, founder of OTTVerse. I have a Ph.D. in Video Compression from the Illinois Institute of Technology, and I have worked on Video Compression (AVC, HEVC, MultiView Plus Depth), ABR streaming, and Video Analytics (QoE, Content & Audience, and Ad) for several years.

I hope to use my experience and love for video streaming to bring you information and insights into the OTT universe.


  1. 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];\
    [v0][fg]overlay[out]” \
    -map [out] \
    -c:v libx264 -bf 16 -crf 30 -trellis 2 -direct-pred auto touchdown-vintage.mp4

  2. 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.

  3. 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.

2 Trackbacks / Pingbacks

  1. === === popular today
  2. Für neue Macs: App-Downloader nutzt Cask-Katalog ›

Leave a Reply

Your email address will not be published.