I'm trying to satisfy a few layering scenarios for building video files using ffmpeg.
Scenario 1: Overlay a video (specifying opacity of the video) on top of an image, creating a new video as the result.
I solved this with:
ffmpeg -i video.mp4 -i image.jpg -filter_complex '[0]format=rgba,colorchannelmixer=aa=0.7,scale=w=3840:h=2160[a];[1][a]overlay=0:0' -t 30 output.mp4
I'm scaling the video to 3840x2160 to match my image (ideally I'd have them matching beforehand).
Scenario 2: 3 layers now, video - image - image. The middle image layer is a transparent image with text. So we have a base image, with text overlaid, and a video on top of that at a certain opacity.
I solved this with:
ffmpeg -i video.mp4 -i image.jpg -i text.png -filter_complex '[0]format=rgba,colorchannelmixer=aa=0.7,scale=w=3840:h=2160[a];[2][a]overlay=0:0,scale=w=3840:h=2160[b];[1][b]overlay=0:0' -t 30 output.mp4
Scenario 3 (which I can't get working): Same as Scenario #2, but with text on top of the video.
I tried re-arranging my filter, hoping to affect the layering order:
ffmpeg -i video.mp4 -i image.jpg -i text.png -filter_complex '[2]overlay=0:0,scale=w=3840:h=2160[a];[0][a]format=rgba,colorchannelmixer=aa=0.7,scale=w=3840:h=2160[b];[1][b]overlay=0:0' -t 5 output.mp4
But that gives the following error:
Too many inputs specified for the "format" filter. Error initializing complex filters. Invalid argument
Full Error:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
Metadata: major_brand : mp42 minor_version : 0 compatible_brands: mp42mp41 creation_time : 2018-03-09T20:52:18.000000ZDuration: 00:00:30.00, start: 0.000000, bitrate: 8002 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 7997 kb/s, 24 fps, 24 tbr, 24k tbn, 48 tbc (default)
Metadata: creation_time : 2018-03-09T20:52:18.000000Z handler_name : Alias Data Handler encoder : AVC Coding Input #1, image2, from 'image.jpg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 526829 kb/s
Stream #1:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 3840x2160 [SAR 96:96 DAR 16:9], 25 tbr, 25 tbn, 25 tbc Input #2, png_pipe, from 'text.png': Duration: N/A, bitrate: N/A
Stream #2:0: Video: png, rgba(pc), 1500x1500, 25 tbr, 25 tbn, 25 tbc [AVFilterGraph @ 0x7fc37d402de0]
Too many inputs specified for the "format" filter. Error initializing complex filters. Invalid argument
I can sort of get around that by tweaking the command so that the text isn't an input to the overlay:
ffmpeg -i lightTexture.mp4 -i image.jpg -i textSample.png -filter_complex '[2]overlay=0:0,scale=w=3840:h=2160;[0]format=rgba,colorchannelmixer=aa=0.7,scale=w=3840:h=2160[b];[1][b]overlay=0:0' -t 5 output_text_on_top.mp4
But then my output video is all messed up. I suspect I am on the wrong track by trying to cram all of this into the -filter_complex
. I'm wondering if I need to create two overlays and then overlay those (i.e overlay Text onto the Video, and then overlay that onto the base image) though I'm not sure how to accomplish that.
If anyone could point me in the right direction here, I'd be super grateful.