我以这个应用于视频的文本效果为例,并在本地运行它,只改变文本本身,它不适用于我输入的任何类型的文本。例如,如果我将Cool Effect替换为Quick Effect,则视频将显示Q ff。
同样,The quick brown fox jumped over the lazy dogs变成了f。
这个代码示例的源代码:letters.html是moviepy的作者。
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)并不能解决这个问题:
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是很重要的,但每个字体大小都有不同的最佳检测大小。这很棘手,但需要一个更好的包装函数来管理。)
帮助最大限度地增强与字母的对比的是:
caption = TextClip("some text",
color='white',
bg_color="black",
kerning=5,
fontsize=33)在没有指定bg_color的情况下,它只找到一个字母,而不考虑rem_thr。
将bg_color设置为黑色可以帮助它找到字母。也许我需要使用一个块状的脂肪字体来工作,白色的黑色,然后删除背景,然后应用到视频。
但是这个演示肯定很难可靠地使用。
发布于 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解决了这个问题。

https://stackoverflow.com/questions/72350659
复制相似问题