FFMPEG 需要帮助来优化命令

FFMPEG 需要帮助来优化命令

我正在使用 FFMPEG 进行多项操作。我有 5 个文件。

  1. intro_image.jpg:这是任意分辨率的图像,但将是 jpeg。
  2. intro_audio.mp3:该音频是持续7秒的静态输入。
  3. outro_image.jpg:这是任意分辨率的图像,但将是 jpeg。
  4. outro_audio.mp3:该音频是持续 7 秒的静态输入。
  5. 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] 连接过滤器将所有段连接/合并为单个输出。

相关内容