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 秒。我正在寻找一种在不损失视频质量的情况下优化这些命令的方法。

为了正确连接,所有输入必须具有相同的属性,因此在连接之前使用多个过滤器使它们完全相同:

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- setar过滤器使纵横比相同。concat 过滤器要求所有段具有相同的纵横比。

  • fps=25- fps过滤器用于设置用户视频的帧速率以匹配图像的帧速率。因为您的输入是任意的,所以您需要使用 fps 过滤器来设置特定的帧速率。

  • aformat=r=44100:cl=stereo- 一种格式过滤器,使所有音频具有相同的采样率和通道布局。

  • [introv][introa][userv][usera][outrov][outroa]concat=n=3:v=1:a=1[v][a] concat过滤器将所有段连接/连接成单个输出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章