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 
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 –

  1. our old-school film-grain-scratchy video
  2. 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 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

Krishna Rao Vijayanagar, Ph.D., is the Editor-in-Chief of OTTVerse, a news portal covering tech and business news in the OTT industry.

With extensive experience in video encoding, streaming, analytics, monetization, end-to-end streaming, and more, Krishna has held multiple leadership roles in R&D, Engineering, and Product at companies such as Harmonic Inc., MediaMelon, and Airtel Digital. Krishna has published numerous articles and research papers and speaks at industry events to share his insights and perspectives on the fundamentals and the future of OTT streaming.

Pallycon April NAB 2024

11 thoughts on “Create Vintage Videos Using FFmpeg in 4 Simple Steps”

  1. Pingback: === popurls.com === popular today

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

  3. Pingback: Für neue Macs: App-Downloader nutzt Cask-Katalog › ifun.de

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

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

Leave a Comment

Your email address will not be published. Required fields are marked *

Enjoying this article? Subscribe to OTTVerse and receive exclusive news and information from the OTT Industry.