RunningBComeOn 2024-12-09 11:06 采纳率: 25%
浏览 151
已结题

使用moviepy库视频合并时出错


# 将一个视频加上片头和片尾

import os
 
# 设置新的工作目录
new_path = r'C:\Users\WangZhongQing\Desktop\video'
os.chdir(new_path)
 
# 验证当前工作目录已更改
print(os.getcwd())

from moviepy.editor import VideoFileClip, concatenate_videoclips

# 加载视频文件
video_A = VideoFileClip("模块2 2.1 交换机基础知识01.mp4")  
video_B = VideoFileClip("模块2 2.1 交换机基础知识02.mp4")
video_C = VideoFileClip("片头.mp4")  # 片头
video_D = VideoFileClip("片尾.mp4")  # 片尾

# 拼接视频
video_A_with_CD = concatenate_videoclips([video_C, video_A, video_D], method="compose")
video_B_with_CD = concatenate_videoclips([video_C, video_B, video_D], method="compose")

# 注意:确保输出路径是正确的,并且您有足够的权限写入该路径。
# 如果路径包含中文或特殊字符,请确保您的系统支持这些字符,或者使用英文路径。
output_path_A = "path/to/output_A_with_CD.mp4"
output_path_B = "path/to/output_B_with_CD.mp4"

# 输出结果视频
video_A_with_CD.write_videofile(output_path_A, codec="libx264", audio_codec="aac")
video_B_with_CD.write_videofile(output_path_B, codec="libx264", audio_codec="aac")


运行之后出现如下错误:


```python
chunk:   1%|▋                                                             | 90/8180 [00:00<00:16, 489.46it/s, now=None]
Moviepy - Building video path/to/output_A_with_CD.mp4.
MoviePy - Writing audio in output_A_with_CDTEMP_MPY_wvf_snd.mp3
                                                                                                                       
MoviePy - Done.
Moviepy - Writing video path/to/output_A_with_CD.mp4

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[28], line 30
     27 output_path_B = "path/to/output_B_with_CD.mp4"
     29 # 输出结果视频
---> 30 video_A_with_CD.write_videofile(output_path_A, codec="libx264", audio_codec="aac")
     31 video_B_with_CD.write_videofile(output_path_B, codec="libx264", audio_codec="aac")

File ~\.conda\envs\py38\lib\site-packages\decorator.py:232, in fun(*args, **kw)
    230 evaldict = dict(_call_=caller, _func_=func)
    231 es = ''
--> 232 for i, extra in enumerate(extras):
    233     ex = '_e%d_' % i
    234     evaldict[ex] = extra

File ~\.conda\envs\py38\lib\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 ~\.conda\envs\py38\lib\site-packages\decorator.py:232, in fun(*args, **kw)
    230 evaldict = dict(_call_=caller, _func_=func)
    231 es = ''
--> 232 for i, extra in enumerate(extras):
    233     ex = '_e%d_' % i
    234     evaldict[ex] = extra

File ~\.conda\envs\py38\lib\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 ~\.conda\envs\py38\lib\site-packages\decorator.py:232, in fun(*args, **kw)
    230 evaldict = dict(_call_=caller, _func_=func)
    231 es = ''
--> 232 for i, extra in enumerate(extras):
    233     ex = '_e%d_' % i
    234     evaldict[ex] = extra

File ~\.conda\envs\py38\lib\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 ~\.conda\envs\py38\lib\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 ~\.conda\envs\py38\lib\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 ~\.conda\envs\py38\lib\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


视频下载链接(视频下载之后请勿滥用,有版权归属)
https://pan-yz.cldisk.com/external/m/file/1072834797179961344

  • 写回答

28条回答 默认 最新

  • 一位热心程序猿 2024-12-09 11:13
    关注

    哥们,你是用AI写的吧,好歹把路径改一下呢,path/to/output_A_with_CD.mp4

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(27条)

报告相同问题?

问题事件

  • 系统已结题 12月19日
  • 已采纳回答 12月11日
  • 创建了问题 12月9日