繁体   English   中英

如何使用 opencv python 以 mp4 格式保存视频捕获

[英]How to save video capture in mp4 format with opencv python

伙计们,我正在使用以下代码使用 opencv 和 python 捕获桌面视频:

import numpy as np
import cv2                                           
from mss import mss                                  
from PIL import Image

bounding_box = {'top': 100, 'left': 0, 'width': 400, 'height': 300}

sct = mss()
                                                 
while True:
 sct_img = sct.grab(bounding_box)                     
 cv2.imshow('screen', np.array(sct_img))             
 if(cv2.waitKey(1) & 0xFF) == ord('q'):
  cv2.destroyAllWindows()
  break

我希望能够以 mp4 格式保存此捕获,我该怎么做?

它应该像这样工作。

import numpy as np
import cv2                                           
from mss import mss                                  
from PIL import Image

bounding_box = {'top': 100, 'left': 0, 'width': 400, 'height': 300}

sct = mss()
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640,480))
                                                
while True:
  sct_img = sct.grab(bounding_box)   
  out.write(np.array(sct_img))                  
  cv2.imshow('screen', np.array(sct_img))             
  if(cv2.waitKey(1) & 0xFF) == ord('q'):
      cv2.destroyAllWindows()
      break

官方文档在Getting Started with Videos中展示了示例

import numpy as np
import cv2 as cv

cap = cv.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))

while cap.isOpened():
    ret, frame = cap.read()

    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break

    frame = cv.flip(frame, 0)

    # write the flipped frame
    out.write(frame)

    cv.imshow('frame', frame)

    if cv.waitKey(1) == ord('q'):
        break

# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()

首先,您必须使用 4 个字符的代码设置编解码器。 有带有代码的页面fourcc.org

不同的系统可能使用不同的编解码器——主要是DIVXXVIDMJPGX264WMV1WMV2

fourcc = cv.VideoWriter_fourcc(*'XVID')

接下来,您必须设置文件名和扩展名、 FPS 、宽度、高度

out = cv.VideoWriter('output.avi', fourcc, 20.0, (400,  300))

某些编解码器不适用于某些扩展 - 您可能需要检查不同的组合( .avi.mp4.mkv.mov等)

如果图像有400x300而你想要视频800x600然后设置VideoWriter(..., (800, 600))但你还必须在写入之前调整每一帧的大小因为VideoWriter不会自动调整它的大小 - 它跳过帧(没有错误)并且最后它创建空文件(~4kb)。

frame = cv2.resize(frame, (800, 600))

out.write(frame)

VideoWriter(.., 20.0, ...)设置20 FPS (每秒帧数),但它不是写入速度,而是视频播放器必须以多快的速度显示它的信息。

如果您每秒创建 20 帧,那么播放器将以正确的速度显示它。 如果您每秒创建 10 帧,那么播放器的显示速度将提高 2 倍。 如果你每秒创建 40 帧,那么播放器将以一半的速度显示它。


它使用程序FFMPEG ,您可以看到在系统控制台/终端中运行的编解码器列表

ffmpeg -codecs

或在源代码中(带有 4 个字符的代码)

http://ffmpeg.org/doxygen/trunk/isom_8c-source.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM