I have a lot of videos that are either 720x1280 or 1280x720. I want to convert all of them to 1280x720, but for the ones that are portrait I would like to show the full video with the remaining space to the left and right being a darkened, blurred version of the video.
I think this is pretty close to that, but it seems to go on forever (maybe because the color keeps providing frames?)
ffmpeg -i video.mp4 -lavfi "\
[email protected]:size=720x405[dark];
[0:v]crop=720:405[blurbase];
[blurbase]boxblur=lr='min(h,w)/20':lp=1:cr='min(cw,ch)/20':cp=1[blurred];
[blurred][dark]overlay[darkened];
[darkened]scale=1280:720[bg];
[0:v]scale=-1:720[fg];
[bg][fg]overlay=(W-w)/2:(H-h)/2" \
-vb 800K video_out.mp4
You can see that it just starts adding duplicate frames after it hits the end of the video (in the logging below the video is ~24 sec):
Stream mapping:
Stream #0:0 (h264) -> crop (graph 0)
Stream #0:0 (h264) -> scale (graph 0)
overlay (graph 0) -> Stream #0:0 (libx264)
Stream #0:1 -> #0:1 (aac (native) -> aac (native))
...
Past duration 0.999992 too large 2256kB time=00:00:24.33 bitrate= 759.4kbits/s dup=1 drop=0 speed=1.36x
Past duration 0.799995 too large
frame= 3177 fps=101 q=-1.0 Lsize= 3797kB time=00:01:45.80 bitrate= 294.0kbits/s dup=407 drop=0 speed=3.37x
How do I fix the issue of the encoding not completing when the end of the video file is reached?
Also, is there a way to conditionally only do the blurred background work if the video is portrait so landscape videos don't spend a lot of unnecessary CPU on blurring the video?
-vb 800k
), use a target quality value, e.g.-crf 18
, or two-pass encoding. This will provide an overall better quality / bitrate efficiency. See trac.ffmpeg.org/wiki/Encode/H.264