![ffmpeg:텍스트를 오른쪽 하단에서 화면 중앙으로 이동하는 방법](https://rvso.com/image/1692533/ffmpeg%3A%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%ED%95%98%EB%8B%A8%EC%97%90%EC%84%9C%20%ED%99%94%EB%A9%B4%20%EC%A4%91%EC%95%99%EC%9C%BC%EB%A1%9C%20%EC%9D%B4%EB%8F%99%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
오른쪽 하단(배경 외부)에서 화면 중앙으로 텍스트를 이동하려고 합니다. 검정색 텍스트는 녹색 텍스트가 있는 위치에 정확하게 위치해야 합니다.
이것이 내가 시도한 것입니다:
ffplay -f lavfi -loop 0 -i "color=color=yellow:size=800x400,drawtext=text='Test':fontsize=70:font='Arial Black':fontcolor=green:x=(W-tw)/2:y=(H-th)/2,drawtext=text='Test':fontcolor=black:fontsize=70:font='Arial Black':x=W-(t)*((W+tw)/2)/6:y=x*(H/W):enable='between(t,0,6)'"
답변1
수학은 조금 복잡할 수도 있지만 가능합니다.
800
W= , H= 400
, tw= 170
, th= 를 미리 알고 있다고 가정합니다 54
.
다음 매개변수를 미리 계산할 수 있습니다.
alpha = atan2(H, W) = atan2(400, 800)
sin_alpha = sin(alpha) = 0.4472136 alternately: sin_alpha = H/sqrt(W*W+H*H)
cos_alpha = cos(alpha) = 0.8944272 alternately: cos_alpha = W/sqrt(W*W+H*H)
tw = 170
th = 54
radius = sqrt((W/2+tw/2)^2 + (H/2+th/2)^2) = sqrt((400+85)^2 + (200+27)^2) = 535.5
step = radius / duration = radius / 6 = 89.249
r = radius - t*step = 535.5 - t*3.57
center_x = W/2 + r*cos_alpha
center_y = H/2 + r*sin_alpha
x = center_x - tw/2 = W/2 + r*cos_alpha - tw/2 = 400+(535.5-t*89.249)*0.8944272-85
y = center_y - th/2 = H/2 + r*sin_alpha - th/2 = 200+(535.5-t*89.249)*0.4472136-27
FFplay 명령:
ffplay -f lavfi -loop 0 -i "color=color=yellow:size=800x400,drawtext=text='Test':fontsize=70:fontfile=ariblk.ttf:fontcolor=green:x=(W-tw)/2:y=(H-th)/2,drawtext=text='Test':fontcolor=black:fontsize=70:fontfile=ariblk.ttf:x=(400+(535.5-t*89.249)*0.8944272-85):y=(200+(535.5-t*89.249)*0.4472136-27):enable='between(t,0,6)'"
생성을 위한 FFmpeg 명령 test.gif
:
ffmpeg -y -f lavfi -i "color=color=yellow:size=800x400:duration=6,format=rgb24,drawtext=text='Test':fontsize=70:fontfile=ariblk.ttf:fontcolor=green:x=(W-tw)/2:y=(H-th)/2,drawtext=text='Test':fontcolor=black:fontsize=70:fontfile=ariblk.ttf:x=(400+(535.5-t*89.249)*0.8944272-85):y=(200+(535.5-t*89.249)*0.4472136-27):enable='between(t,0,6)',split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" test.gif
모든 상수를 바꾸고 W, H, tw, th만 사용합니다.
ffmpeg -y -f lavfi -i "color=color=yellow:size=800x400:duration=6,format=rgb24,drawtext=text='Test':fontsize=70:fontfile=ariblk.ttf:fontcolor=green:x=(W-tw)/2:y=(H-th)/2,drawtext=text='Test':fontcolor=black:fontsize=70:fontfile=ariblk.ttf:x=(W/2+(sqrt((W/2+tw/2)*(W/2+tw/2)+(H/2+th/2)*(H/2+th/2))-t*sqrt((W/2+tw/2)*(W/2+tw/2)+(H/2+th/2)*(H/2+th/2))/6)*W/sqrt(W*W+H*H)-tw/2):y=(H/2+(sqrt((W/2+tw/2)*(W/2+tw/2)+(H/2+th/2)*(H/2+th/2))-t*sqrt((W/2+tw/2)*(W/2+tw/2)+(H/2+th/2)*(H/2+th/2))/6)*H/sqrt(W*W+H*H)-th/2):enable='between(t,0,6)',split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" test.gif