Last active
March 2, 2025 09:37
-
-
Save rabssm/72da6413ba08db7dd2072ac6dfd50b59 to your computer and use it in GitHub Desktop.
ffmpeg tips
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Interpolate video frames for a higher frame rate | |
ffmpeg -i source.mp4 -filter:v minterpolate -r 25 result.mp4 | |
ffmpeg -i source.mp4 -vf minterpolate=50,tblend=all_mode=average,framestep=2 result.mp4 | |
# Change the framerate (to 5 fps) of an input h264 raw video and convert to mkv | |
ffmpeg -r 5 -i input.h264 -vcodec copy output.mkv | |
# Crop a video to the bottom right quarter | |
ffmpeg -i in.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy out.mp4 | |
# Resize a video to half size | |
ffmpeg -i input.mkv -filter_complex "scale=in_w/2:in_h/2" output.mkv | |
# Crop a video to window xsize:ysize:x:y | |
ffmpeg -y -i shot0020.avi -vf 'crop=320:240:380:380' cropped.mp4 | |
# Crop a video and then rescale | |
ffmpeg -y -i input.avi -vf 'crop=500:300:500:800,scale=1000:600' output.mp4 | |
# Overlay a video resized to 640x480 onto a background video in the bottom right corner | |
ffmpeg -i shot0020.avi -i cropped.mp4 -filter_complex "[1] scale=640:480 [over]; [0][over] overlay=640:480" result.mp4 | |
# Convert a video in portrait to landscape with blurred sides | |
ffmpeg -i input.mp4 -lavfi '[0:v]scale=ih*16/9:-1,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[bg][0:v]overlay=(W-w)/2:(H-h)/2,crop=h=iw*9/16' -vb 800K output.mp4 | |
# Play a video flipped and mirrored (upside down) | |
mplayer -vf mirror,flip video.mp4 | |
######################################## | |
# Watermark a video | |
ffmpeg -i input.mkv -vf "drawtext=fontfile=Arial.ttf: text='©2019 Somebody': x=(w-tw)/2: y=h/2: fontcolor=white: box=1: fontsize=36: boxcolor=0x00000099" output.mp4 | |
# Watermark a video with a copyright image | |
convert -fill grey -transparent white -font Arial -pointsize 72 label:"©2019 Somebody" -shade 120x45 name.png | |
ffmpeg -i input.mkv -i name.png -filter_complex "[1]lut=a=val*0.4[a];[0][a]overlay=(W-w)/2:(H-h)/2" output.mp4 | |
# Watermark a video with a stylish large copyright symbol | |
convert -size 1200x800 -gravity West -fill black -transparent white -font Arial -pointsize 800 label:"©" -shade 240x40 copyright.png | |
convert -fill black -transparent white -font Arial -pointsize 96 label:"@your_name" -shade 240x40 name.png | |
composite -gravity Center -geometry -40-20 name.png copyright.png stamp.png | |
convert stamp.png -resize 30% stamp.png # Resize the stamp as required for the video | |
ffmpeg -i input.mp4 -i stamp.png -filter_complex "[1]lut=a=val*0.20[a];[0][a]overlay=w/4:H-h" -vcodec h264 output.mp4 | |
######################################## | |
# Overlay a black triangle at the bottom of a video | |
convert -size 60x60 xc:none -fill black -stroke black -draw "path 'M 0,0 L 30,45 L 60,0 Z' " -flip triangle.png | |
ffmpeg -i input.mp4 -i triangle.png -filter_complex "[1]lut=a=val*1.0[a];[0][a]overlay=W/2-w/2:H-h" -vcodec h264 triangled.mp4 | |
# Overlay a frame number on the video | |
ffmpeg -i input.mp4 -vf "drawtext=fontfile=Arial.ttf: text=%{n}: x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000099" output.mp4 | |
# Overlay a date and time on the video | |
ffmpeg -i input.mp4 -vf "drawtext=fontfile=Arial.ttf: text='%{pts\:gmtime\:1507046400\:%d-%m-%Y %T}': x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000099" output.mp4 | |
# Convert an animated gif file to mp4 video | |
ffmpeg -f gif -i input.gif -pix_fmt yuv420p output.mp4 | |
# Convert a video to a gif | |
ffmpeg -i input.mkv -filter_complex "fps=25,scale=1280:-1:flags=lanczos[x];[x]split[x1][x2];[x1]palettegen[p];[x2][p]paletteuse" output.gif | |
# Convert a video to a gif - 2 step process | |
ffmpeg -y -i input.mkv -vf palettegen palette.png | |
ffmpeg -y -i input.mkv -i palette.png -filter_complex paletteuse -r 25 output.gif | |
# Convert a set of images to a gif (framerate 4 frames/s) | |
ffmpeg -framerate 4 -pattern_type glob -i '*.png' output.gif | |
# Get the first frame of a video | |
ffmpeg -i video.mp4 -frames:v 1 %04d.png | |
# Make a video showing a single image (-t 1 for a 1s video) | |
ffmpeg -loop 1 -i input.jpg -c:v libx264 -t 1 -pix_fmt yuv420p output.mp4 | |
# Trim the start and end of a video | |
ffmpeg -i input.mp4 -ss 00:00:03 -t 00:00:08 -vcodec copy output.mp4 | |
####################### | |
# Concatenate 2 videos | |
ffmpeg -i concat:"input1.mkv|input2.mkv" output.mkv | |
# ... or | |
# Create a file e.g. mylist.txt showing the input videos: | |
file input1.mkv | |
file input2.mkv | |
# Then use the command | |
ffmpeg -f concat -i mylist.txt -vcodec copy output.mkv | |
####################### | |
# Stack 2 videos vertically (use hstack for side by side) | |
ffmpeg -i input0 -i input1 -filter_complex vstack=inputs=2 output | |
# Increase the brightness of a video | |
ffmpeg -i input.mkv -vf "lutrgb='r=3*val:g=3*val:b=3*val'" output.mkv | |
# Increase the brightness and contrast of a video | |
ffmpeg -i input.mkv -vf eq=brightness=0.45:contrast=2.0:saturation=2 output.mkv | |
# Change the RGB values of a video | |
ffmpeg -i input.mkv -vf colorchannelmixer=rr=1.2:gg=0.9:bb=0.8 output.mkv | |
# Blur a video | |
ffmpeg -i input.mkv -vf "boxblur=2:1" output.mkv | |
# Simulate a camera tremble | |
ffmpeg -i input.mkv -filter:v "crop=in_w/1.01:in_h/1.01:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)" -vcodec h264 tremble.mkv | |
# Get Keyframe positions by frame number | |
ffprobe -show_frames -select_streams v:0 -print_format csv $VIDEO_FILE 2> /dev/null | awk -F ',' '{ if ($4 > 0) print NR; }' | |
# Stream output from a raspberry pi camera using raspivid to a sequence of 900s videos files. The '-a 12' adds a timestamp to the video | |
raspivid -t 0 -a 12 -w 1296 -h 972 -ex auto -o - | ffmpeg -i - -f segment -strftime 1 -segment_time 900 -reset_timestamps 1 -vcodec copy video_%Y%m%d_%H%M%S.mkv |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment