You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MoviePy提取视频帧到Word文档时遇AttributeError报错求助

问题解决:AttributeError: 'numpy.ndarray' object has no attribute 'save_frame'

错误原因

video.get_frame()返回的是numpy数组(存储帧的像素数据),而save_frame是VideoFileClip类的方法,并非numpy数组的内置方法,因此直接调用frame.save_frame()会触发属性错误。

解决方法

方法1:直接使用VideoFileClip的save_frame方法(推荐)

无需先获取帧数组,直接调用video.save_frame()保存指定时间点的帧,代码更简洁高效:

from moviepy.editor import VideoFileClip
from docx import Document
from docx.shared import Inches
import os

def extract_frames_to_docx(mp4_file, output_docx, interval=1):
    # 打开视频文件
    video = VideoFileClip(mp4_file)
    # 创建新Word文档
    doc = Document()
    # 计算视频总帧数
    total_frames = int(video.duration * video.fps)
    # 生成需要提取的帧索引列表
    frame_indices = range(0, total_frames, interval)
    
    for idx in frame_indices:
        image_path = f"frame_{idx}.png"
        # 直接保存指定时间点的帧
        video.save_frame(image_path, t=idx / video.fps)
        # 将图片插入Word文档
        doc.add_picture(image_path, width=Inches(6))
        # 可选:删除临时图片文件,避免磁盘残留
        os.remove(image_path)
    
    # 保存文档并释放资源
    doc.save(output_docx)
    video.close()

# 调用示例:每10帧提取一次
extract_frames_to_docx("testvideo.mp4", "video_frames1.docx", interval=10)

方法2:将numpy数组转为PIL图像保存

如果需要对提取的帧做额外处理(比如裁剪、调色),可以先将numpy数组转为PIL图像再保存:

from moviepy.editor import VideoFileClip
from docx import Document
from docx.shared import Inches
from PIL import Image
import numpy as np
import os

def extract_frames_to_docx(mp4_file, output_docx, interval=1):
    video = VideoFileClip(mp4_file)
    doc = Document()
    total_frames = int(video.duration * video.fps)
    frame_indices = range(0, total_frames, interval)
    
    for idx in frame_indices:
        # 获取帧的numpy数组
        frame = video.get_frame(idx / video.fps)
        # 将numpy数组转换为PIL图像(moviepy返回的帧为RGB格式,无需调整通道顺序)
        img = Image.fromarray(np.uint8(frame))
        image_path = f"frame_{idx}.png"
        # 保存图像文件
        img.save(image_path)
        # 插入到Word文档
        doc.add_picture(image_path, width=Inches(6))
        # 删除临时文件
        os.remove(image_path)
    
    doc.save(output_docx)
    video.close()

extract_frames_to_docx("testvideo.mp4", "video_frames1.docx", interval=10)

补充说明

  • 两种方法均可实现需求,方法1无需额外处理帧数据,更适合基础场景;
  • 若需要保留提取的帧文件,可删除代码中的os.remove(image_path)行。

内容的提问来源于stack exchange,提问作者Arpita Satpathy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:23:20