ffmpeg - Concat N命令

时间:2018-05-13 16:27:34

标签: ffmpeg

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

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

这个过程非常慢,大约需要20分钟才能将所有内容添加到2分钟的视频中(每次迭代需要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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

有两种可能的情况

  1. 您需要单个输出文件(示例1)。
  2. 您需要所有中间文件(示例2)。
  3. 如果您只需要一个输出文件,那么您可以指定一个公共输出文件名,即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
    

    等等。

    我认为这可以解决您的问题。