This is Day 12 of the #100DaysOfPython challenge.
Let’s create the
hello-moviepy directory and install Pillow.
At this stage, we can write our script to annotate the video.
Annotating the video
As an example, here is a Gif of my video that I am editing:
The video is a short clip of my
workingoutloud.dev site. It is around 9 seconds long and I want to add some text to it.
From watching the video, there are three things that are essentially in the demo:
- Viewing tasks and subtasks.
- Sorting subtasks.
- Opening the current goals.
These occur at the 0:00, 0:03 and 0:06 second mark respectively.
We can add in some captions for each of these easily thanks to MoviePy.
main.py, add the following:
In the above code, we simply import the required modules and then we create a
VideoFileClip object from the video file (relative to the project root directory).
We now want to create a
TextClip object for each of the three points in the video.
According to the MoviePy TextClip docs, we can see the
TextClip constructor can take some relevant arguments around the text, font, color and font size.
TextClip instance itself then has access to methods to set the position, duration and start time. We will abstract our sensible defaults into a function and implement this:
After writing out the helper method, we are creating three
TextClip instances for each of our different annotations that we wish to add to the video.
Finally, we can compose them all together into a
CompositeVideoClip object and write out the video file.
I am also writing out a
.giffile to use as a preview of the video on this post.
We can now run our script with
python main.py. There will be some progress bars to indicate the progress.
After the script has completed, we can now see
wol_dev_edited.gif in the
The outcome looks like so:
Today’s post demonstrated how to use the
MoviePy package to add some text captions to a video programmatically.
I will be hoping to make use of this to help annotate some of my videos that I am working through to save some time in future.
The final code looks like so:
Resources and further reading
Originally posted on my blog. To see new posts without delay, read the posts there and subscribe to my newsletter.