Python:从视频中截取屏幕截图

asd*_*fjk 5 python video screenshot video-processing

这个想法是,用户应该能够从他们的本地机器加载视频,并告诉程序每 5 秒或 30 秒从视频中截取一次屏幕截图。有没有图书馆可以帮助我完成这项任务?关于如何进行的任何想法都会有所帮助。

nci*_*ica 5

通过发出以下命令安装 opencv-python(这是一个非官方的 Python 预构建 OpenCV 包):

pip install opencv-python
Run Code Online (Sandbox Code Playgroud)
# Importing all necessary libraries
import cv2
import os
import time

# Read the video from specified path
cam = cv2.VideoCapture("C:/Users/User/Desktop/videoplayback.mp4")

try:

    # creating a folder named data
    if not os.path.exists('data'):
        os.makedirs('data')

    # if not created then raise error
except OSError:
    print('Error: Creating directory of data')

# frame
currentframe = 0

while (True):
    time.sleep(5) # take schreenshot every 5 seconds
    # reading from frame
    ret, frame = cam.read()

    if ret:
        # if video is still left continue creating images
        name = './data/frame' + str(currentframe) + '.jpg'
        print('Creating...' + name)

        # writing the extracted images
        cv2.imwrite(name, frame)

        # increasing counter so that it will
        # show how many frames are created
        currentframe += 1
    else:
        break

# Release all space and windows once done
cam.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

  • time.sleep(5) 部分只会使脚本运行速度变慢,而不是在屏幕截图间隔内 (3认同)

Dat*_*fer 5

上面的答案部分正确,但这里的 time.sleep 根本没有帮助,反而使过程变慢。但是,如果您想在视频的某个时间截取屏幕截图,您需要了解每次执行“ret,frame = cam.read()”时,它都会读取视频的下一帧。视频中的每一秒都有多少帧取决于视频。你可以使用以下方法得到这个数字:

  frame_per_second = cam.get(cv2.CAP_PROP_FPS) 
Run Code Online (Sandbox Code Playgroud)

因此,如果您需要截取第三秒的屏幕截图,您可以按照上述答案中的方式保留迭代,然后添加

  if currentframe == (3*frame_per_second):  
      cv2.imwrite(name, frame)
Run Code Online (Sandbox Code Playgroud)

这将在第 3 秒截取第一帧的屏幕截图。