Skip to content
Related Articles

Related Articles

Improve Article

MoviePy – Text with moving Letters

  • Last Updated : 26 Jul, 2021

In this article we will see how we can move the letters of the text clip MoviePy. MoviePy is a Python module for video editing, which can be used for basic operations on videos and GIF’s. Video is formed by the frames, combination of frames creates a video each frame is an individual image. VideoClip is the base class for all the other video clips in MoviePy. Text with moving letters, is like letters are spreading and rearranging themselves, creating a moving effect.
 

In order to do so we have to do the following : 
1. Import the numpy and moviepy module 
2. Create a text clip and set its various properties 
3. From text clip create a composite video clip 
4. Create methods for moving letters effect 
5. Create clips using the methods one by one 
6. Combine the clips to obtain final video clip 
7. Set fps to the final clip 
8. Show the final clip 
 

Below is the implementation 
 

Python3




# importing Numpy
import numpy as np
 
# importing moviepy module
from moviepy.editor import * from moviepy.video.tools.segmenting import findObjects
 
# screen size
screensize = (720, 460)
 
# creating a text clip of color green, font is Arial and size is 80
txtClip = TextClip('GeeksforGeeks', color = 'lightgreen', font = "Arial",
                   kerning = 5, fontsize = 80)
 
# creating a composite video of given size
cvc = CompositeVideoClip( [txtClip.set_pos('center')],
                        size = screensize)
 
# helper function
rotMatrix = lambda a: np.array( [[np.cos(a), np.sin(a)],
                                 [-np.sin(a), np.cos(a)]] )
 
 
# creating a effect 1 method
def effect1(screenpos, i, nletters):
     
    # damping
    d = lambda t : 1.0/(0.3 + t**8)
    # angle of the movement
    a = i * np.pi / nletters
     
    # using helper function
    v = rotMatrix(a).dot([-1, 0])
     
    if i % 2 : v[1] = -v[1]
         
    # returning the function
    return lambda t: screenpos + 400 * d(t)*rotMatrix(0.5 * d(t)*a).dot(v)
 
# method for effect 2
def effect2(screenpos, i, nletters):
     
    # numpy array
    v = np.array([0, -1])
     
    d = lambda t : 1 if t<0 else abs(np.sinc(t)/(1 + t**4))
     
    # returing the function
    return lambda t: screenpos + v * 400 * d(t-0.15 * i)
 
 
 
# a list of ImageClips
letters = findObjects(cvc)
 
 
# method to move letters
def moveLetters(letters, funcpos):
     
    return [ letter.set_pos(funcpos(letter.screenpos, i, len(letters)))
              for i, letter in enumerate(letters)]
 
# adding clips with specific effect
clips = [ CompositeVideoClip( moveLetters(letters, funcpos),
                              size = screensize).subclip(0, 5)
          for funcpos in [effect1, effect2] ]
 
# comping all the clips
final_clip = concatenate_videoclips(clips)
 
# setting fps of the final clip
final_clip.fps = 24
 
# showing video clip
final_clip.ipython_display()

Output : 
 



Moviepy - Building video __temp__.mp4.
Moviepy - Writing video __temp__.mp4

                                                                                                                       
Moviepy - Done !
Moviepy - video ready __temp__.mp4

 

Another example 
 

Python3




# importing Numpy
import numpy as np
 
# importing moviepy module
from moviepy.editor import * from moviepy.video.tools.segmenting import findObjects
 
# screen size
screensize = (1080, 720)
 
# creating a text clip of color red, font is Arial and size is 80
txtClip = TextClip('GeeksforGeeks', color = 'red', font = "Arial",
                   kerning = 5, fontsize = 80)
 
# creating a composite video of given size
cvc = CompositeVideoClip( [txtClip.set_pos('center')],
                        size = screensize)
 
# helper function
rotMatrix = lambda a: np.array( [[np.cos(a), np.sin(a)],
                                 [-np.sin(a), np.cos(a)]] )
 
 
 
# method for effect 3
def effect3(screenpos, i, nletters):
     
    v = np.array([-1, 0])
     
    d = lambda t : max(0, 3-3 * t)
     
    # retruning the function
    return lambda t: screenpos-400 * v*d(t-0.2 * i)
 
# method for effect 4
def effect4(screenpos, i, nletters):
     
    # damping
    d = lambda t : max(0, t)
     
     # angle of the movement
    a = i * np.pi / nletters
     
    v = rotMatrix(a).dot([-1, 0])
     
    if i % 2 : v[1] = -v[1]
         
    # returing the function
    return lambda t: screenpos + 400 * d(t-0.1 * i)*rotMatrix(-0.2 * d(t)*a).dot(v)
 
 
 
# a list of ImageClips
letters = findObjects(cvc)
 
 
# method to move letters
def moveLetters(letters, funcpos):
     
    return [ letter.set_pos(funcpos(letter.screenpos, i, len(letters)))
              for i, letter in enumerate(letters)]
 
# adding clips with specific effect
clips = [ CompositeVideoClip( moveLetters(letters, funcpos),
                              size = screensize).subclip(0, 5)
          for funcpos in [effect3, effect4] ]
 
# comping all the clips
final_clip = concatenate_videoclips(clips)
 
# setting fps of the final clip
final_clip.fps = 24
 
# showing video clip
final_clip.ipython_display()

Output : 
 

Moviepy - Building video __temp__.mp4.
Moviepy - Writing video __temp__.mp4

                                                                                                                       
Moviepy - Done !
Moviepy - video ready __temp__.mp4

 

 

 Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.  

To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course. And to begin with your Machine Learning Journey, join the Machine Learning – Basic Level Course




My Personal Notes arrow_drop_up
Recommended Articles
Page :