在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”。要解决此问题,您可以尝试以下步骤:
问题出在上一句: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环境的版本,以便更进一步地进行调查和解决。
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环境冲突,重装了环境解决了问题。