Search code examples
ffmpeg

Overlaying one video on another one, and making black pixels transparent


I'm trying to use FFMPEG to create a video with one video overlayed on top another.

I have 2 MP4s. I need to make all BLACK pixels in the overlay video transparent so that I can see the main video underneath it.

I found two ways to overlay one video on another:

First, the following positions the overlay in the center, and therefore, hides that portion of the main video beneath it:

    ffmpeg -i 1.mp4 -vf "movie=2.mp4 [a]; [in][a] overlay=352:0 [b]" combined.mp4 -y

And, this one, places the overlay video on the left, but it's opacity is set to 50% so at least other one beneath it is visible:

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]setpts=PTS-STARTPTS[top]; [1:v]setpts=PTS-STARTPTS, format=yuva420p,colorchannelmixer=aa=0.5[bottom]; [top][bottom]overlay=shortest=0" -acodec libvo_aacenc -vcodec libx264 out.mp4 -y

My goal is simply to make all black pixels in the overlay (2.mp4) completely transparent. How can this be done.


Solution

  • The notional way to do this is to chroma-key the black out and then overlay, But as @MoDJ said, this likely won't produce satisfactory results. Neither will the method I suggest below, but it's worth a try.

    ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex
    "[1]split[m][a];
     [a]geq='if(gt(lum(X,Y),16),255,0)',hue=s=0[al];
     [m][al]alphamerge[ovr];
     [0][ovr]overlay"
    output.mp4
    

    Above, I duplicate the overlay video stream, then use the geq filter to manipulate the luma values so that any pixel with luma greater than 16 (i.e. not pure black) has its luma set to white, else zero. Since I haven't provided expressions for the two color channels, geq falls back on the luma expression. We don't want that, so I use the hue filter to nullify those channels. Then I use the alphamerge filter to merge this as an alpha channel with the first copy of the overlay video. Then, the overlay. Like I said, this may not produce satisfactory results. You can tweak the value 16 in the geq filter to change the black threshold. Suggested range is 16-24 for limited-range (Y: 16-235) video files.