使用moviepy时发生TypeError: must be real number, not NoneType

在Windows下,moviepy版本为1.0.3,执行视频读写操作,出现了TypeError: must be real number, not NoneType错误,网络上的解决方法都不管用

from moviepy.editor import *
clip = VideoFileClip('demo/demo.mp4')
clip.write_videofile('demo/demo2.mp4',fps=clip.fps)
Traceback (most recent call last):
  File "D:\Project\PycharmProjects\mmaction2\tp.py", line 3, in <module>
    clip.write_videofile('demo/demo2.mp4',fps=clip.fps)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\decorator.py", line 232, in fun
    return caller(func, *(extras + args), **kw)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\decorators.py", line 54, in requires_duration
    return f(clip, *a, **k)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\decorator.py", line 232, in fun
    return caller(func, *(extras + args), **kw)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\decorators.py", line 135, in use_clip_fps_by_default
    return f(clip, *new_a, **new_kw)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\decorator.py", line 232, in fun
    return caller(func, *(extras + args), **kw)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\decorators.py", line 22, in convert_masks_to_RGB
    return f(clip, *a, **k)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\video\VideoClip.py", line 300, in write_videofile
    ffmpeg_write_video(self, filename, fps, codec,
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\video\io\ffmpeg_writer.py", line 212, in ffmpeg_write_video
    with FFMPEG_VideoWriter(filename, clip.size, fps, codec = codec,
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\video\io\ffmpeg_writer.py", line 88, in __init__
    '-r', '%.02f' % fps,
TypeError: must be real number, not NoneType
Moviepy - Building video demo/demo2.mp4.
Moviepy - Writing video demo/demo2.mp4

问题最开始源于执行下面这段命令,即执行mmaction2项目的demo_spatiotemporal_det.py,发生了同样的错误。

python demo/demo_spatiotemporal_det.py ^
demo/demo.mp4 ^
demo/output_demo.mp4 ^
--config configs/detection/slowonly/slowonly_kinetics400-pretrained-r101_8xb16-8x8x1-20e_ava21-rgb.py ^
--checkpoint checkpoints/slowonly_omnisource_pretrained_r101_8x8x1_20e_ava_rgb_20201217-16378594.pth ^
--det-config demo/demo_configs/faster-rcnn_r50_fpn_2x_coco_infer.py ^
--det-checkpoint checkpoints/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth ^
--det-score-thr 0.9 ^
--action-score-thr 0.5 ^
--label-map tools/data/ava/label_map.txt ^
--predict-stepsize 8 ^
--output-stepsize 4 ^
--output-fps 6

输出结果

Loads checkpoint by local backend from path: checkpoints/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth
Performing Human Detection for each frame
[                                                  ] 0/28, elapsed: 0s, ETA:07/13 16:58:49 - mmengine - WARNING - "FileClient" will be deprecated in future. Please use io functions in https://mmengine.readthedocs.io/en/latest/api/fileio.html#file-io
07/13 16:58:49 - mmengine - WARNING - "HardDiskBackend" is the alias of "LocalBackend" and the former will be deprecated in future.
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 28/28, 3.6 task/s, elapsed: 8s, ETA:     0s
Loads checkpoint by local backend from path: checkpoints/slowonly_omnisource_pretrained_r101_8x8x1_20e_ava_rgb_20201217-16378594.pth
Performing SpatioTemporal Action Detection for each clip
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  ] 27/28, 6.2 task/s, elapsed: 4s, ETA:     0sPerforming visualization
Moviepy - Building video demo/output_demo.mp4.
Moviepy - Writing video demo/output_demo.mp4

Traceback (most recent call last):
  File "D:\Project\PycharmProjects\mmaction2\demo\demo_spatiotemporal_det.py", line 375, in <module>
    main()
  File "D:\Project\PycharmProjects\mmaction2\demo\demo_spatiotemporal_det.py", line 369, in main
    vid.write_videofile(args.out_filename)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\decorator.py", line 232, in fun
    return caller(func, *(extras + args), **kw)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\decorators.py", line 54, in requires_duration
    return f(clip, *a, **k)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\decorator.py", line 232, in fun
    return caller(func, *(extras + args), **kw)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\decorators.py", line 135, in use_clip_fps_by_default
    return f(clip, *new_a, **new_kw)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\decorator.py", line 232, in fun
    return caller(func, *(extras + args), **kw)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\decorators.py", line 22, in convert_masks_to_RGB
    return f(clip, *a, **k)
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\video\VideoClip.py", line 300, in write_videofile
    ffmpeg_write_video(self, filename, fps, codec,
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\video\io\ffmpeg_writer.py", line 212, in ffmpeg_write_video
    with FFMPEG_VideoWriter(filename, clip.size, fps, codec = codec,
  File "D:\anaconda3\envs\mmlab\lib\site-packages\moviepy\video\io\ffmpeg_writer.py", line 88, in __init__
    '-r', '%.02f' % fps,
TypeError: must be real number, not NoneType

当函数或方法期望实数(浮点数)作为参数,但却收到 None 值时,moviepy 中通常会出现错误消息“TypeError:必须是实数,而不是 NoneType”。要解决此问题,您可以尝试以下步骤:

  1. 检查参数是否缺失或不正确:检查发生错误的代码,并确保正确提供 moviepy 函数或方法所需的所有参数。确保没有任何参数设置为 None。
  2. 验证输入文件或数据:如果在读取或处理视频文件或数据时发生错误,请确保文件或数据可访问且格式正确。检查文件路径是否正确,文件没有损坏。
  3. 更新moviepy版本:确保您使用的是最新版本的moviepy。您可以通过在命令提示符或终端中运行“pip install --upgrade moviepy”来更新它。
  4. 检查依赖项:验证 moviepy 所需的所有依赖项均已安装且是最新的。一些依赖项包括 numpy、imageio 和 imageio-ffmpeg。
  5. 调试代码:如果问题仍然存在,请尝试通过添加打印语句或使用调试器来跟踪错误来调试代码。这可以帮助识别导致问题的特定代码行,并提供更多信息以进行故障排除。

问题出在上一句:clip = VideoFileClip('demo/demo.mp4'),取回的clip.fps为空,所以报错了。查一下看看为什么为空。

采用chatgpt:
这个错误可能是因为在MoviePy中使用的帧率(fps)参数为None,而实际上需要传递一个实际的数值。在你的代码中,你尝试使用clip.fps作为帧率参数,但它返回了None,导致出现了这个错误。

要解决这个问题,你可以尝试手动指定一个合适的帧率值作为参数,而不是使用clip.fps。例如,你可以将帧率设置为整数值,如25或30,具体取决于你的需求。下面是修改后的代码示例:

from moviepy.editor import *

clip = VideoFileClip('demo/demo.mp4')
fps = 30  # 设置帧率为30
clip.write_videofile('demo/demo2.mp4', fps=fps)

这里我将帧率设置为了30,你可以根据实际需要进行调整。运行修改后的代码,看看问题是否得到解决。

TypeError: must be real number, not NoneType是一个常见的moviepy错误,你在调用write_videofile方法时,fps参数没有正确传入或识别。意味着你的moviepy版本过低或不兼容,或者你的代码有一些语法或逻辑错误,或者你没有重启你的内核或环境
参考 https://stackoverflow.com/questions/68032884/getting-typeerror-must-be-real-number-not-nonetype-whenever-trying-to-run-wr

fps数值为None了,不是实际值。

把代码:

clip.write_videofile('demo/demo2.mp4',fps=clip.fps)

改为:

clip.write_videofile('demo/demo2.mp4',fps=int(clip.fps))

可以保证你的fps的值是个实数。

还有方法无效的话,可能是视频文件不包含fps信息,或moviepy解析不了。这样你要手动设置fps值

clip.write_videofile('demo/demo2.mp4',fps=30)

假设设置fps值为30,看视频文件自己修改

这个错误通常是由于在使用moviepy库进行视频处理时,无法获取视频的帧率(fps)导致的。这可能是因为您的视频文件没有正确读取帧率的信息或帧率为None

为了解决这个问题,您可以尝试手动指定视频的帧率。在您的代码中,将write_videofile方法的fps参数更改为一个有效的帧率值,例如30或24:

clip.write_videofile('demo/demo2.mp4', fps=30)

如果您仍然无法获取视频的帧率信息,您可以尝试使用VideoFileClip对象的duration属性来计算帧率,并将其作为参数传递给write_videofile方法:

fps = clip.duration / clip.reader.nframes
clip.write_videofile('demo/demo2.mp4', fps=fps)

请注意,上述代码假设视频的时长(duration)和帧数(nframes)是有效的。如果视频文件本身存在问题,可能需要使用其他工具或方法来修复或获取正确的帧率信息。

另外,还可以尝试更新moviepy库的版本,以确保使用的是最新的稳定版本,并检查相关依赖项是否正确安装。

如果问题仍然存在,请提供视频文件的更多详细信息以及您使用的操作系统和Python环境的版本,以便更进一步地进行调查和解决。

img


你把每一步打印一下看看就知道那个地方数值有什么问题,你看看我写的代码,我先检查一下是否为空在执行,你参考一下吧,

clip = VideoFileClip('demo/demo.mp4')
# 检查None类型并设置默认帧率值
if clip.fps is None:
    clip.fps = 30  # 指定一个默认的帧率,例如30
clip.write_videofile('demo/demo2.mp4', fps=clip.fps)

python环境冲突,重装了环境解决了问题。