首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TextClip动画(例如向视频中添加带有移动字母的文本)不起作用,但文档中的演示语句除外

TextClip动画(例如向视频中添加带有移动字母的文本)不起作用,但文档中的演示语句除外
EN

Stack Overflow用户
提问于 2022-05-23 14:57:12
回答 1查看 610关注 0票数 1

我以这个应用于视频的文本效果为例,并在本地运行它,只改变文本本身,它不适用于我输入的任何类型的文本。例如,如果我将Cool Effect替换为Quick Effect,则视频将显示Q ff

同样,The quick brown fox jumped over the lazy dogs变成了f

这个代码示例的源代码:letters.htmlmoviepy的作者。

代码语言:javascript
复制
import numpy as np

from moviepy.editor import *
from moviepy.video.tools.segmenting import findObjects

# WE CREATE THE TEXT THAT IS GOING TO MOVE, WE CENTER IT.

screensize = (720,460)
txtClip = TextClip('Cool effect',color='white', font="Amiri-Bold",
                   kerning = 5, fontsize=100)
cvc = CompositeVideoClip( [txtClip.set_pos('center')],
                        size=screensize)

# THE NEXT FOUR FUNCTIONS DEFINE FOUR WAYS OF MOVING THE LETTERS


# helper function
rotMatrix = lambda a: np.array( [[np.cos(a),np.sin(a)], 
                                 [-np.sin(a),np.cos(a)]] )

def vortex(screenpos,i,nletters):
    d = lambda t : 1.0/(0.3+t**8) #damping
    a = i*np.pi/ nletters # angle of the movement
    v = rotMatrix(a).dot([-1,0])
    if i%2 : v[1] = -v[1]
    return lambda t: screenpos+400*d(t)*rotMatrix(0.5*d(t)*a).dot(v)
    
def cascade(screenpos,i,nletters):
    v = np.array([0,-1])
    d = lambda t : 1 if t<0 else abs(np.sinc(t)/(1+t**4))
    return lambda t: screenpos+v*400*d(t-0.15*i)

def arrive(screenpos,i,nletters):
    v = np.array([-1,0])
    d = lambda t : max(0, 3-3*t)
    return lambda t: screenpos-400*v*d(t-0.2*i)
    
def vortexout(screenpos,i,nletters):
    d = lambda t : max(0,t) #damping
    a = i*np.pi/ nletters # angle of the movement
    v = rotMatrix(a).dot([-1,0])
    if i%2 : v[1] = -v[1]
    return lambda t: screenpos+400*d(t-0.1*i)*rotMatrix(-0.2*d(t)*a).dot(v)



# WE USE THE PLUGIN findObjects TO LOCATE AND SEPARATE EACH LETTER

letters = findObjects(cvc) # a list of ImageClips


# WE ANIMATE THE LETTERS

def moveLetters(letters, funcpos):
    return [ letter.set_pos(funcpos(letter.screenpos,i,len(letters)))
              for i,letter in enumerate(letters)]

clips = [ CompositeVideoClip( moveLetters(letters,funcpos),
                              size = screensize).subclip(0,5)
          for funcpos in [vortex, cascade, arrive, vortexout] ]

# WE CONCATENATE EVERYTHING AND WRITE TO A FILE

final_clip = concatenate_videoclips(clips)
final_clip.write_videofile('../../coolTextEffects.avi',fps=25,codec='mpeg4')

我已经倾注了这个片段,不知道“文本”本身会在哪里发生变化。可能与letters变量和findObjects有关,它们定位TextClip中的每个字母并遍历它们。

但我想知道更多关于电影和为什么这4种效果不起作用的一般情况。我查看了github和youtube上的数百个项目,找出了一些演示这些的人,但没有找到任何更好的例子。

如果您解决了这个问题,我可能会发布一个公共github包/ repo,这样可以更容易地将它们应用到视频中。电影文档几乎完全忽略了TextClip功能。

在这里输入链接描述

==更新==

在@Rotem提出建议之后,我尝试使用findObjects(clip, rem_thr) rem_thr param。它默认为500,这意味着忽略所检测到的小于500的对象。将其更改为任何其他阈值(500、250、50、10、1)并不能解决这个问题:

代码语言:javascript
复制
500 (test text arrive wiggly) findObjects found 18 letters from string of length 23
250 (test text arrive wiggly) findObjects found 20 letters from string of length 23
50 (test text arrive wiggly) findObjects found 22 letters from string of length 23
10 (test text arrive wiggly) findObjects found 22 letters from string of length 23
1 (test text arrive wiggly) findObjects found 22 letters from string of length 23

(我意识到字符串中只有20个字母,但我检查了字符的数量,包括空格。因此,22与小写is上的字母加点数相匹配,而20是所需的数字。因此,调整rem_thr是很重要的,但每个字体大小都有不同的最佳检测大小。这很棘手,但需要一个更好的包装函数来管理。)

帮助最大限度地增强与字母的对比的是:

代码语言:javascript
复制
caption = TextClip("some text",
    color='white',
    bg_color="black",
    kerning=5,
    fontsize=33)

在没有指定bg_color的情况下,它只找到一个字母,而不考虑rem_thr

bg_color设置为黑色可以帮助它找到字母。也许我需要使用一个块状的脂肪字体来工作,白色的黑色,然后删除背景,然后应用到视频。

但是这个演示肯定很难可靠地使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-24 21:15:50

letters = findObjects(cvc)替换为:letters = findObjects(cvc, 50)

findObjects方法获得第二个可选参数:rem_thr=500

论据描述:

rem_thr :发现的所有大小< rem_Thr的对象都将被视为假阳性,并将被删除

当使用'Quick Effect'而不是'Cool effect'时,大多数对象的大小都小于500。

rem_thr值降低到50解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72350659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档