Using ffmpeg I want to stack three elements vertically. The the first two elements are images, while the third is a box I want to draw using the drawbox command. Is it possible to do so? What I was able to do was to stack two images vertically and draw a box on the image in the bottom, but this is not what I want.
Any help would be really appreciated
vstack + pad
You can stack with vstack and then add the box with pad:
ffmpeg -i image0.jpg -i image1.png -filter_complex "[0][1]vstack=inputs=2,pad=iw:ih+200:color=red" -frames:v 1 output.png
color filter + vstack
You can use the color filter to make a colored box, then stack with vstack:
ffmpeg -i image0.jpg -i image1.png -filter_complex "color=s=1280x360:color=blue[box];[0][1][box]vstack=inputs=3" -frames:v 1 output.jpg
Each input must have the same width. If they do not then add the scale, pad, or crop filters.
See syntax and color names for color options.
Related
I have a video with an image overlay. The picture is set nearly full screen for the first 10 seconds, and aftwerwards I need to zoom out the image to a smaller size and place it in the bottom left corner for the rest of the video.
At the moment I split the input image and overlay it twict to the video, without transitions, one for the "big" picture and one for the "small" picture and it works fine.
What I would like to make is a "zoom out and moove" effect to make it smoother from the big central picture to the small one.
This is my current complex filter:
-i "video.mp4"
-i "img.jpg"
-filter_complex "[1:v]split=2[img10][img20];[img10]scale=1469:856[img11];[img20]scale=293:171[img21];[0:v][img11]overlay=(main_w-overlay_w)/2:(main_h - overlay_h)/2:enable='between(t,0,10)',fade=out:st=9:d=1:alpha=1[vid];[vid][img21]overlay=10:(main_h-overlay_h-40):enable='gte(t,10)'"
-crf 18 -c:a copy "out.mp4"
How can I make it as a single image overlay with zoom out + move effect?
Using ffmpeg version 4.3 or newer, you can animate the scale parameter. And then animate the overlay parameter.
ffmpeg
-i "video.mp4"
-loop 1 -i "img.jpg"
-filter_complex "[1:v]scale=w='if(between(t,10,14),1469-(1469-293)*(t-10)/4,if(lt(t,10),1469,293))':h='if(between(t,10,14),856-(856-171)*(t-10)/4,if(lt(t,10),856,171))':eval=frame[img];[0:v][img]overlay=x='if(between(t,10,14),(W-w)/2-((W-w)/2-10)*(t-10)/4,if(lt(t,10),(W-w)/2,10))':y='if(between(t,10,14),(H-h)/2-((H-h)/2-(H-h-40))*(t-10)/4,if(lt(t,10),(H-h)/2,H-h-40))':shortest=1"
-crf 18 -c:a copy "out.mp4"
I have some videos of resolution 1280 X 720 with black padding area in both left and right side around the display area of all videos. I want to display a static image in padding area of video instead of solid black color. I am working with FFMPEG library but can't find any way to do so. Can you please help me regarding this?
Thank You!
Use the cropdetect filter to determine crop parameters to remove the black. See Remove black bars using ffmpeg for an example of how to get the crop parameters.
Crop the black area and overlay the video over the image:
ffmpeg -i video.mp4 -i background.jpg -filter_complex "[0]crop=404:720:438:0[vid];[1][vid]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" -c:a copy output.mp4
Well, after trying some commands I made a command to do so and its working for me.
ffmpeg -loop 1 -i image.jpg -i video.mp4 -filter_complex "[1:v]scale=1280:720:force_original_aspect_ratio=decrease:-1[fg];[0:v][fg]overlay=(W-w)/2:(H-h)/2:shortest=1" output.mp4
I want to create a background for my text in my video, I use this command:
ffmpeg -i in.mp4 -filter_complex "[0:v]drawtext=font='arial.ttf': text='This is text line 1':x=(w-tw)/2:y=((h-text_h)/2)-(text_h): fontsize=55: fontcolor=red,drawbox=y=(h/2):color=black#0.4:width=iw:height=40:t=max" out.mp4
but I do not know how to get the text height for the drawbox. I tried the box property for drawtext but this just have the width of the text and I want the width of the video. Is there a way to get the height of the text and use in the height property of the drawbox?
Thanks so much
I have an FMPEG command to scale down a video and add a blur to the background to fill the remaining height to 1136, plus add an overlay image, but it comes out at double the size I want. I am trying to get the whole video down to a 640 width without the overlay video being cropped or sized up. I've tried switching around every number but can't seem to get it to work with a width of 640. Thank you for any help.
ffmpeg -i '/z.mp4' -i '/a.png' -filter_complex "[0:v]scale=128/81*iw:128/41*ih,boxblur=luma_radius=min(h\,w)/40:luma_power=3:chroma_radius=min(cw\,ch)/40:chroma_power=1[bg];[bg][0:v]scale=1280:720,overlay=(W-w)/2:(H-h)/2,setsar=1,crop=w=iw*81/128[bg];[bg][1:v]overlay=82.8:118.8" '/h.mp4';
Use
ffmpeg -i '/z.mp4' -i '/a.png'
-filter_complex
"[0:v]scale=-1:1136,
boxblur=lr=min(h\,w)/40:lp=3:cr=min(cw\,ch)/40:cp=1,crop=640:1136[bg];
[0:v]scale=640:-1[vid];
[bg][vid]overlay=(W-w)/2:(H-h)/2[bg];
[bg][1:v]overlay=82.8:118.8,setsar=1" '/h.mp4'
how to mirror + add logo to video?
How to mirror video, then add logo to video using ffmpeg?
To flip a video horizontally, you can use -vf hflip (or vflip for vertical flipping).
To add a watermark of any image to a video is more complex, especially if you want to position it:
-i logo.png -filter_complex "overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2"
There are a lot of things you can do with the overlay filter, check the documentation. It gets extremely complex if you also want to scale the overlay, so make sure your logo file is the right size before that.
However, you cannot mix -vf and -filter_complex, so the flipping has to become part of the complex filter. So, for your desired result, you'd have to do this (assuming you want the logo to be at position 10/10):
ffmpeg -i input.mp4 -i logo.png -filter_complex "hflip[flipped];[flipped]overlay=x=10:y=10" out.mp4