FFmpeg技术问询:竖屏基础视频裁剪叠加及音频提取问题
解决方案与问题解答
1. 获取基础视频时长
用ffprobe命令直接提取:
- 输出秒数格式:
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 base.mp4 - 输出时分秒格式:
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -sexagesimal base.mp4
如果只是要让基础视频时长匹配叠加视频,无需手动获取,用-shortest参数即可自动让输出时长取两个输入视频中较短的那个(即叠加视频的时长)。
2. 实现视频叠加(裁剪+居中覆盖)
必须使用FFmpeg的overlay滤镜,而非单纯映射流。以下是整合裁剪与叠加的滤镜逻辑:
先将基础视频裁剪为9:16竖屏,再把叠加视频水平居中、放置在基础视频上方区域(可调整垂直位置),同时自动对齐时长。
3. 映射叠加视频的音频
- 先确认
overlay.mp4是否有音频流:运行ffmpeg -i overlay.mp4,查看输出中是否有音频流条目(如Stream #0:1)。如果没有音频,需先给叠加视频补音频,否则无法满足“保留叠加视频音频”的需求。 - 如果有音频,用
-map 0:a映射叠加视频的音频;怕无音频时报错,就用-map 0:a?(?表示流不存在时自动忽略)。你的原命令用-map 1:a是取基础视频的音频,所以要改成0:a或0:a?。
完整FFmpeg命令
ffmpeg -i overlay.mp4 -i base.mp4 \ -vf "[1:v]crop=ih*(9/16):ih,scale=1080:1920[base];[base][0:v]overlay=(main_w-overlay_w)/2:(main_h*0.1):shortest=1" \ -map 0:a? -map "[base]" \ -c:v libx264 -crf 21 \ output.mp4
命令说明:
[1:v]crop=ih*(9/16):ih:将基础视频裁剪为9:16竖屏比例;scale=1080:1920强制固定为手机竖屏分辨率(可根据需求修改)overlay=(main_w-overlay_w)/2:(main_h*0.1):叠加视频水平居中,垂直位置在基础视频顶部往下10%的区域(可把0.1改成0贴顶,或(main_h-overlay_h)/2完全居中)shortest=1:输出时长自动匹配叠加视频的长度,无需手动裁剪基础视频-map 0:a?:优先取叠加视频的音频,无音频时不报错
内容的提问来源于stack exchange,提问作者roku
相关产品推荐
相关产品推荐

