我正在使用 FFMPEG 进行多项操作。我有 5 个文件。
- intro_image.jpg:这是任意分辨率的图像,但将是 jpeg。
- intro_audio.mp3:该音频是持续7秒的静态输入。
- outro_image.jpg:这是任意分辨率的图像,但将是 jpeg。
- outro_audio.mp3:该音频是持续 7 秒的静态输入。
- user_video.mp4:用户视频可以是任意分辨率,但最低为 480P,并且可以是任意格式,如 mp4、avi、mkv。视频的最大时长仅为 1 分钟。
我正在做的是将所有 480P 的视频与黑色背景合并。
步骤 1:合并 intro_image.jpg 和 intro_audio.mp3 以创建 intro_video.mp4
ffmpeg -loop 1 -i #{params[:intro_image].path} -i #{params[:intro_audio].path} -vf 'scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:-1:-1:color=black' -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest #{dir}/#{intro_video_name}
第 2 步:合并 outro_image.jpg 和 outro_audio.mp3 以创建 outro_video.mp4
ffmpeg -loop 1 -i #{params[:outro_image].path} -i #{params[:outro_audio].path} -vf 'scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:-1:-1:color=black' -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest #{dir}/#{outro_video_name}
步骤 3:我检查音频是否可用user_video.mp4
。如果没有,则:
ffmpeg -i #{params[:video].path} -f lavfi -i anullsrc -c:v copy -c:a aac -shortest #{video_path}
步骤4:根据提供的start_time
&修剪用户视频end_time
。
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
步骤5:合并所有三个视频。
ffmpeg -y -i #{dir}/#{intro_video_name} -i #{video_path} -i #{dir}/#{outro_video_name} -filter_complex '[0:v]scale=640x480,setsar=1[v0];[1:v]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:-1:-1:color=black,setsar=1[v1];[2:v]scale=640x480,setsar=1[v2];[v0][0:a][v1][1:a][v2][2:a]concat=n=3:v=1:a=1' -ab 48000 -ac 2 -ar 22050 -s 640x480 -vcodec libx264 -crf 27 -preset ultrafast -vsync vfr #{dir}/#{final_video_name}
如果总文件大小为 10 MB,所有这些步骤大约需要 40 秒。我正在寻找一种在不损失视频质量的情况下优化这些命令的方法。
答案1
为了正确连接,所有输入必须具有相同的属性,因此在连接之前使用多个过滤器使它们全部相同:
ffmpeg -loop 1 -t 7 -framerate 25 -i intro_image.jpg -i intro_audio.mp3 -loop 1 -t 7 -framerate 25 -i outro_image.jpg -i outro_audio.mp3 -i user_video.mp4 -filter_complex "[0:v]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:-1:-1:color=black,format=yuv420p,setsar=1[introv];[2:v]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:-1:-1:color=black,format=yuv420p,setsar=1[outrov];[4:v]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:-1:-1:color=black,format=yuv420p,fps=25,setsar=1[userv];[1:a]aformat=r=44100:cl=stereo[introa];[4:a]aformat=r=44100:cl=stereo[usera];[3:a]aformat=r=44100:cl=stereo[outroa];[introv][introa][userv][usera][outrov][outroa]concat=n=3:v=1:a=1[v][a]" -map "[v]" -map "[a]" -movflags +faststart output.mp4
scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:-1:-1:color=black
-规模和软垫过滤器使图像/视频适合 640x480,如图所示使用 ffmpeg 调整视频大小以适应静态大小format=yuv420p
-格式过滤器使色度子采样相同。或者,您可以在 concat 的输出上仅使用一个格式过滤器实例。setsar=1
-塞萨尔过滤器使纵横比相同。concat 过滤器要求所有段具有相同的纵横比。fps=25
-每秒帧数过滤器将用户视频的帧速率设置为与图像的帧速率相匹配。由于您的输入是任意的,因此您需要使用 fps 过滤器来设置特定的帧速率。aformat=r=44100:cl=stereo
-格式过滤器使所有音频具有相同的采样率和通道布局。[introv][introa][userv][usera][outrov][outroa]concat=n=3:v=1:a=1[v][a]
连接过滤器将所有段连接/合并为单个输出。