Android平台FFmpeg-Kit:合并4条独立FFmpeg命令技术咨询
合并FFmpeg命令实现多效果的解决方案
核心思路
直接用&&是依次执行多个独立命令,会生成中间文件且效率低,还容易因参数冲突报错。正确方式是用FFmpeg的-filter_complex(复杂滤镜),在一次编码流程中串联所有特效,全程无需中间文件。
完整命令(适配你的需求)
假设你的输入文件为:input.mp4(原视频)、start.jpg(开头图)、end.jpg(结尾图)、border.png(边框图),完整命令如下:
ffmpeg -i input.mp4 -i start.jpg -i end.jpg -i border.png -filter_complex "\ # 1. 生成回旋镖特效:原视频 + 倒放的原视频 [0:v]reverse[r]; \ [0:v][r]concat=n=2:v=1:a=0,setpts=PTS-STARTPTS[boomerang]; \ \ # 2. 给回旋镖视频添加居中PNG边框 [boomerang][3:v]overlay=(W-w)/2:(H-h)/2:format=auto[bordered]; \ \ # 3. 处理开头2秒的封面图(匹配视频帧率) [1:v]fps=fps=30,trim=duration=2,setpts=PTS-STARTPTS[start_clip]; \ \ # 4. 处理中间视频:去掉开头2秒,再去掉最后2秒(留位置给结尾图) [bordered]trim=start=2,setpts=PTS-STARTPTS[main_clip]; \ [main_clip]trim=end=2,setpts=PTS-STARTPTS[main_trimmed]; \ \ # 5. 处理结尾2秒的封面图(匹配视频帧率) [2:v]fps=fps=30,trim=duration=2,setpts=PTS-STARTPTS[end_clip]; \ \ # 6. 拼接开头、中间、结尾视频流 [start_clip][main_trimmed][end_clip]concat=n=3:v=1:a=0[final_video]; \ \ # 7. 处理音频:生成回旋镖音频 + 结尾淡出 [0:a]areverse[reversed_audio]; \ [0:a][reversed_audio]concat=n=2:v=0:a=1[boomerang_audio]; \ [boomerang_audio]afade=t=out:st=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4 | awk '{print $1*2 - 2}'):d=2[final_audio] \ " -map "[final_video]" -map "[final_audio]" -c:v libx264 -c:a aac -y output.mp4
命令分步解释
- 回旋镖特效:用
reverse倒放原视频,再通过concat把原视频和倒放视频拼接,setpts修正时间戳避免播放卡顿。 - 添加PNG边框:
overlay滤镜把边框图居中覆盖在视频上,format=auto自动适配透明通道。 - 开头/结尾封面:用
trim截取2秒时长,fps统一图片帧率和视频一致(把30改成你的视频实际帧率),setpts修正时间戳。 - 拼接所有片段:
concat把开头封面、中间处理后的视频、结尾封面按顺序拼接。 - 音频处理:倒放音频后和原音频拼接(匹配视频回旋镖),最后用
afade在结尾2秒淡出音频,ffprobe自动计算淡出开始时间(原视频时长×2 - 2)。
注意事项
- 替换命令中的文件名(
input.mp4、start.jpg等)为你的实际文件路径。 - 如果你的视频帧率不是30,把命令中的
fps=30改成对应数值(可以用ffprobe input.mp4 -v error -select_streams v -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1查看帧率)。 - 如果视频没有音频,去掉音频相关的滤镜部分,命令中删除
[0:a]...[final_audio]的代码,同时把-map "[final_audio]"去掉。 -y参数会自动覆盖输出文件output.mp4,如果需要确认再覆盖,去掉该参数。
内容的提问来源于stack exchange,提问作者D-MAN
相关产品推荐
相关产品推荐

