首页 > 解决方案 > ffmpeg - 在具有复杂过滤器的视频上绘制旋转文本需要很长时间

问题描述

我正在尝试在视频中的某些占位符上重叠不同的文本片段,并且我正在使用以下类型的多个复杂过滤器:

ffmpeg -i ~/Desktop/input.mp4 -filter_complex  \
    "color=black@0:100x100,format=yuva444p[c]; \
    [c][0]scale2ref[ct][mv31]; \
    [ct]setsar=1,split=1[t31];\
    [t31]\
    drawtext=text='text':x='main_w/2-text_w/2+70':y=210:fontsize="100":fontcolor=black,\
    drawtext=text='text2':x='main_w/2-text_w/2+75':y=340:fontsize="100":fontcolor=black,\
    rotate=-0.07:ow=rotw(-0.07):oh=roth(-0.07):c=black@0[txta31]; \
    [mv31][txta31]overlay=enable='between(t, 0, 1.15)':x='min(0,-H*sin(-0.07))':y='min(0,W*sin(-0.07))':shortest=1" \
       ~/Desktop/result.mp4 -y1

我的目标是在视频的不同时间间隔上写出不同旋转的文本。问题是在大约 10-12 [t31] 样的片段(这里是仅一个命令的示例),视频的渲染时间是视频时间的两倍,而绘制直线水平文本大约需要 10-20占总视频长度的百分比(例如,对于 1 分钟的视频,写直线水平文本大约需要 8-10 秒,写相同数量的文本大约需要 2 分钟,但倾斜一个角度)。有没有更好的方法来执行这些具有更高性能的多个旋转文本位?

标签: ffmpeg

解决方案


有没有更好的方法来执行这些具有更高性能的多个旋转文本位?

使用字幕过滤器会更快,而且可以说更简单。示例ASS文件:

[Script Info]
; Script generated by Aegisub 3.2.2
; http://www.aegisub.org/
Title: Default Aegisub file
ScriptType: v4.00+
WrapStyle: 0
ScaledBorderAndShadow: yes
YCbCr Matrix: None
PlayResX: 640
PlayResY: 480

[Aegisub Project Garbage]
Last Style Storage: Default
Video File: ?dummy:23.976000:40000:640:480:47:163:254:
Video AR Value: 1.333333
Active Line: 1

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,100,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:01.15,Default,,0,0,0,,{\pos(400,180),\frz10}text
Dialogue: 0,0:00:00.00,0:00:01.15,Default,,0,0,0,,{\pos(400,260),\frz10}text2

示例命令:

ffmpeg -i input -filter_complex "subtitles=rotate.ass[v]" -map "[v]" -map 0:a? -c:a copy output

在此处输入图像描述


推荐阅读