1

Due to limitations of Google Colab resources, I am trying to use MoviePy on other platforms. The latest platform I tried was a free account on DeepNote. However, when executing the code:

from moviepy.editor import *

text_clip = TextClip("Hello world!", fontsize=70, color='white')

bg_clip = ColorClip(size=(720, 480), color='black')

final_clip = CompositeVideoClip([bg_clip, text_clip]).set_duration(10)

final_clip.write_videofile("texto.mp4", fps=30)

The following errors happen:

Moviepy - Building video texto.mp4.
Moviepy - Writing video texto.mp4

TypeError: must be real number, not NoneType
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In [1], line 13
     10 final_clip = CompositeVideoClip([bg_clip, text_clip]).set_duration(10)
     12 # Salvando o resultado
---> 13 final_clip.write_videofile("texto.mp4", fps=30)

File /shared-libs/python3.10/py-core/lib/python3.10/site-packages/decorator.py:232, in decorate.<locals>.fun(*args, **kw)
    230 if not kwsyntax:
    231     args, kw = fix(args, kw, sig)
--> 232 return caller(func, *(extras + args), **kw)

File ~/venv/lib/python3.10/site-packages/moviepy/decorators.py:54, in requires_duration(f, clip, *a, **k)
     52     raise ValueError("Attribute 'duration' not set")
     53 else:
---> 54     return f(clip, *a, **k)

File /shared-libs/python3.10/py-core/lib/python3.10/site-packages/decorator.py:232, in decorate.<locals>.fun(*args, **kw)
    230 if not kwsyntax:
    231     args, kw = fix(args, kw, sig)
--> 232 return caller(func, *(extras + args), **kw)

File ~/venv/lib/python3.10/site-packages/moviepy/decorators.py:135, in use_clip_fps_by_default(f, clip, *a, **k)
    130 new_a = [fun(arg) if (name=='fps') else arg
    131          for (arg, name) in zip(a, names)]
    132 new_kw = {k: fun(v) if k=='fps' else v
    133          for (k,v) in k.items()}
--> 135 return f(clip, *new_a, **new_kw)

File /shared-libs/python3.10/py-core/lib/python3.10/site-packages/decorator.py:232, in decorate.<locals>.fun(*args, **kw)
    230 if not kwsyntax:
    231     args, kw = fix(args, kw, sig)
--> 232 return caller(func, *(extras + args), **kw)

File ~/venv/lib/python3.10/site-packages/moviepy/decorators.py:22, in convert_masks_to_RGB(f, clip, *a, **k)
     20 if clip.ismask:
     21     clip = clip.to_RGB()
---> 22 return f(clip, *a, **k)

File ~/venv/lib/python3.10/site-packages/moviepy/video/VideoClip.py:300, in VideoClip.write_videofile(self, filename, fps, codec, bitrate, audio, audio_fps, preset, audio_nbytes, audio_codec, audio_bitrate, audio_bufsize, temp_audiofile, rewrite_audio, remove_temp, write_logfile, verbose, threads, ffmpeg_params, logger)
    292 if make_audio:
    293     self.audio.write_audiofile(audiofile, audio_fps,
    294                                audio_nbytes, audio_bufsize,
    295                                audio_codec, bitrate=audio_bitrate,
    296                                write_logfile=write_logfile,
    297                                verbose=verbose,
    298                                logger=logger)
--> 300 ffmpeg_write_video(self, filename, fps, codec,
    301                    bitrate=bitrate,
    302                    preset=preset,
    303                    write_logfile=write_logfile,
    304                    audiofile=audiofile,
    305                    verbose=verbose, threads=threads,
    306                    ffmpeg_params=ffmpeg_params,
    307                    logger=logger)
    309 if remove_temp and make_audio:
    310     if os.path.exists(audiofile):

File ~/venv/lib/python3.10/site-packages/moviepy/video/io/ffmpeg_writer.py:213, in ffmpeg_write_video(clip, filename, fps, codec, bitrate, preset, withmask, write_logfile, audiofile, verbose, threads, ffmpeg_params, logger)
    211     logfile = None
    212 logger(message='Moviepy - Writing video %s\n' % filename)
--> 213 with FFMPEG_VideoWriter(filename, clip.size, fps, codec = codec,
    214                             preset=preset, bitrate=bitrate, logfile=logfile,
    215                             audiofile=audiofile, threads=threads,
    216                             ffmpeg_params=ffmpeg_params) as writer:
    218     nframes = int(clip.duration*fps)
    220     for t,frame in clip.iter_frames(logger=logger, with_times=True,
    221                                     fps=fps, dtype="uint8"):

File ~/venv/lib/python3.10/site-packages/moviepy/video/io/ffmpeg_writer.py:88, in FFMPEG_VideoWriter.__init__(self, filename, size, fps, codec, audiofile, preset, bitrate, withmask, logfile, threads, ffmpeg_params)
     77 self.ext = self.filename.split(".")[-1]
     79 # order is important
     80 cmd = [
     81     get_setting("FFMPEG_BINARY"),
     82     '-y',
     83     '-loglevel', 'error' if logfile == sp.PIPE else 'info',
     84     '-f', 'rawvideo',
     85     '-vcodec', 'rawvideo',
     86     '-s', '%dx%d' % (size[0], size[1]),
     87     '-pix_fmt', 'rgba' if withmask else 'rgb24',
---> 88     '-r', '%.02f' % fps,
     89     '-an', '-i', '-'
     90 ]
     91 if audiofile is not None:
     92     cmd.extend([
     93         '-i', audiofile,
     94         '-acodec', 'copy'
     95     ])

TypeError: must be real number, not NoneType

To avoid other errors that I discovered earlier I do:

!sudo apt-get update

!sudo apt install -y imagemagick
!sudo sed -i 's/none/read,write/g'> /etc/ImageMagick-6/policy.xml

!export 'IMAGEMAGICK_BINARY'='/usr/bin/convert'

!pip install moviepy

I just want to use MoviePy to generate a video with text appearing on the screen using Deepnote, but at some point in the code, the variable fps becomes None, resulting in an error in the operation ‘%.02f’ % fps.

tavo
  • 54
  • 4
  • I tested in Ubuntu 18.04. I used ImageMagick 6.9.7-4 Q16 x86_64 20170114. (the command is `convert`). I updated the policy as described [here](https://github.com/open-mmlab/mmaction2/issues/75): /etc/ImageMagick-6/policy.xml. comment out (or remove the line that reads) `` to ``. The code is working. – Rotem Jun 07 '23 at 14:17
  • I will ask in the library's GitHub repository since I'm not sure what the issue is, but it seems that at some point, the variable fps, which should be 30, becomes None, resulting in an error. The strange thing is that this doesn't happen in Google Colab or on my computer. – tavo Jun 08 '23 at 09:19
  • I couldn't reproduce the issue in Ubuntu 18.04. According to your previous comments `'%.02f' % fps` becomes `None` somewhere. Could it be that `30.00` becomes `None`? Could it be related to regional settings? In some European countries the decimal dot is marked using comma, and `30.00` is written as `30,00` ... – Rotem Jun 08 '23 at 11:22
  • This happens across any notebook platform other than google colab but on google colab and my computer it works – tavo Jun 10 '23 at 10:10

0 Answers0