【问题标题】:ffmpeg - Concat N commandsffmpeg - 连接 N 个命令
【发布时间】:2018-10-23 09:37:07
【问题描述】:

我必须在视频上运行 8 到 17 个命令才能添加一些叠加文本和叠加图像。

我的问题是实际上我正在使用一个复杂的解决方案:我获取原始视频,添加一些文本,获取输出,添加更多文本,获取输出,添加图像,...等等。

这个过程真的很慢,将所有内容添加到 2 分钟的视频中大约需要 20 分钟(每次迭代 1-2 分钟)。

这些是我的命令的一些示例。有没有办法将它们全部连接成一个?

在两个时间戳之间添加一行文本

-i "video.mp4" -filter_complex "[0]split[base][text];[text]drawtext=fontfile=Arial.ttf:text='Some text':fontcolor=white:fontsize=32:box=1: boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2 - 15,format=yuva444p,fade=t=in:st=6:d=2:alpha=1,fade=t=out:st=19:d=2:alpha=1[subtitles]; [base][subtitles]overlay" output_text1.mp4

在相同的两个时间戳之间添加另一行文本

-i "output_text1.mp4" -filter_complex "[0]split[base][text];[text]drawtext=fontfile=Arial.ttf:text='some more text':fontcolor=white:fontsize=32:box=1: boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2 + 15,format=yuva444p,fade=t=in:st=6:d=2:alpha=1,fade=t=out:st=19:d=2:alpha=1[subtitles]; [base][subtitles]overlay" output_text2.mp4

在文字后添加第一张图片叠加层

-i "output_text2.mp4" -loop 1 -t 1 -i "1.png" -filter_complex "[1:v]format=yuva422p,scale=1115x1980,setsar=1/1,pad=1.5*iw:1.5*ih:(ow-iw)/2:(oh-ih)/2:color=black@0,zoompan=z='min(zoom+0.0005,1.5)':s=223x396:d=475:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)',fade=in:st=22:d=3.8:alpha=1,fade=out:st=37:d=3.8:alpha=1[im];[0][im]overlay=(main_w-overlay_w)/2:(main_h - overlay_h)/2:shortest=1" -pix_fmt yuv420p -c:a copy output_0.mp4

在第一个图像叠加层之后添加第二个图像叠加层

-i "output_0.mp4" -loop 1 -t 1 -i "2.jpg" -filter_complex "[1:v]format=yuva422p,scale=1490x1965,setsar=1/1,pad=1.5*iw:1.5*ih:(ow-iw)/2:(oh-ih)/2:color=black@0,zoompan=z='min(zoom+0.0005,1.5)':s=298x393:d=475:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)',fade=in:st=41:d=3.8:alpha=1,fade=out:st=56:d=3.8:alpha=1[im];[0][im]overlay=(main_w-overlay_w)/2:(main_h - overlay_h)/2:shortest=1" -pix_fmt yuv420p -c:a copy output_1.mp4

有没有办法连接所有这些命令?或者是否有关于 concat 各种命令的指南?

谢谢!

【问题讨论】:

  • @tripleee 感谢您的链接!不幸的是,我这里已经有多个过滤器,问题在于将 sam 过滤器应用于多个图像或添加不同的叠加操作

标签: ffmpeg


【解决方案1】:

有两种可能的情况

  1. 您需要一个输出文件(示例 1)。
  2. 您需要所有中间文件(示例 2)。

如果您只需要一个输出文件,那么您可以指定一个通用输出文件名,即output_text.mp4,并用 ; 分隔命令。这将以相同的顺序执行所有命令,将最后一个输出作为输入。

示例 1:

-i "video.mp4" -filter_complex "[0]split[base][text];[text]drawtext=fontfile=Arial.ttf:text='Some text':fontcolor=white:fontsize=32:box=1: boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2 - 15,format=yuva444p,fade=t=in:st=6:d=2:alpha=1,fade=t=out:st=19:d=2:alpha=1[subtitles]; [base][subtitles]overlay" output_text.mp4; -i "output_text.mp4" -filter_complex "[0]split[base][text];[text]drawtext=fontfile=Arial.ttf:text='some more text':fontcolor=white:fontsize=32:box=1: boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2 + 15,format=yuva444p,fade=t=in:st=6:d=2:alpha=1,fade=t=out:st=19:d=2:alpha=1[subtitles]; [base][subtitles]overlay" output_text.mp4

如果你需要所有的中间文件然后写一个shell脚本并声明所有输出变量的变量

示例 2:

1 = output_text1.mp4
2 = output_text2.mp4

-i "video.mp4" -filter_complex "[0]split[base][text];[text]drawtext=fontfile=Arial.ttf:text='Some text':fontcolor=white:fontsize=32:box=1: boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2 - 15,format=yuva444p,fade=t=in:st=6:d=2:alpha=1,fade=t=out:st=19:d=2:alpha=1[subtitles]; [base][subtitles]overlay" $1

-i $1 -filter_complex "[0]split[base][text];[text]drawtext=fontfile=Arial.ttf:text='some more text':fontcolor=white:fontsize=32:box=1: boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2 + 15,format=yuva444p,fade=t=in:st=6:d=2:alpha=1,fade=t=out:st=19:d=2:alpha=1[subtitles]; [base][subtitles]overlay" $2

等等。

我想这会解决你的问题。

【讨论】:

  • 感谢您的回复,我给了您赏金,但目前我没有时间测试它。只要我能做到,我会把你标记为答案,否则我会在这里写!同时,感谢您考虑问题并提供帮助! ^^(ps:如果可以的话,能不能多加一点说明如何混合多个命令?)
猜你喜欢
  • 2017-07-04
  • 2018-08-23
  • 2011-12-26
  • 2018-03-08
  • 1970-01-01
  • 2020-11-03
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多