添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement . We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account "TypeError: must be a real number, not NoneType" when trying to use "write_videofile" on any platform other than Google Colab or my computer #1986 "TypeError: must be a real number, not NoneType" when trying to use "write_videofile" on any platform other than Google Colab or my computer #1986 TavoAdr opened this issue Jun 8, 2023 · 6 comments

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', '-'
     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.

Create an upgrade to finally get rid of a bug that make the library unusable (at least in NixOs) #1990

Has anybody been able to crack it, It works fine on my local but using a docker file it shows error

FROM python:3.8
RUN apt-get update && apt-get install texlive-latex-extra -y
RUN apt-get update && apt-get install -y ffmpeg && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install libportaudio2 -y && \
    apt-get install libpango1.0-dev -y
RUN pip3 install moviepy
COPY requirements.txt /reels-gen-service/
WORKDIR /reels-gen-service
RUN pip3 install -r requirements.txt
ADD . /reels-gen-service/
CMD [ "python3", "flask_app.py" ]

Everything works fine till,
Moviepy - Building video ./arithmeticpropexplanation.mp4.
MoviePy - Writing audio in arithmeticpropexplanationTEMP_MPY_wvf_snd.mp3

FFMPEG_VideoWriter(filename, clip.size, fps, codec = codec,\n File \"/usr/local/lib/python3.8/site-packages/moviepy/video/io/ffmpeg_writer.py\", line 88, in __init__\n '-r', '%.02f' % fps,\nTypeError: must be real number, not NoneType"}