天天看點

Python | 正常的視訊操作

正常的視訊操作主要有:縮小視訊分辨率,分辨率不變縮小視訊儲存空間,加快視訊播放速度等功能。不得不說,利用Python及其相應的第三方庫,能使得很多功能變的實作變得更加便捷。

利用Python的第三方庫opencv,實作上述的正常視訊操作的代碼如下所示。後面将對代碼段中各語句塊功能進行較長的描述。

import cv2
from cv2 import VideoWriter,VideoWriter_fourcc

video_root ="D:/yuanlei/test.avi"
out_root = "D:/yuanlei/out.avi"

cap = cv2.VideoCapture(video_root)
fps = cap.get(cv2.CAP_PROP_FPS)
video_width = cap.get()
video_height = cap.get()

resize_width = 1280
resize_height = 960
double_fps = 2*fps

fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
videoWriter = cv2.VideoWriter(out_root,fourcc,fps,(1280,960))

success = cap.isOpened()
while (success):
	success,frame = cap.read()
	print("Read a new frame:",success)
	if not success:
		break
	frame = cv2.resize(frame,(1280,960))
	videoWriter.write(frame)
videoWriter.release()
           

如下部分的代碼段,主要用于提取輸入視訊幀的各種原生參數,比如視訊的幀率,視訊幀的寬高資訊等。

cap = cv2.VideoCapture(video_root)
fps = cap.get(cv2.CAP_PROP_FPS)
video_width = cap.get()
video_height = cap.get()
           

如下部分的代碼段,用于計算需要對視訊做一下操作時的參數,比如需要改變視訊分辨率的對應寬高,又比如需要改變視訊播放速度的幀率。

resize_width = 1280
resize_height = 960
double_fps = 2*fps
           
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
四個字元用來表示壓縮幀的codec 例如:
CV_FOURCC('P','I','M','1') = MPEG-1 codec
CV_FOURCC('M','J','P','G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
NOTE:生成檔案占用空間最小的編碼方式是MPEG-4.2 codec。
在VideoWriter類的構造函數參數為CV_FOURCC('M', 'P', '4', '2') 。
最大的是MPEG-1 codec,
對應在VideoWriter類的構造函數參數為CV_FOURCC('P','I','M','1') ,
所占磁盤空間是前者的5.7倍。
是以如果需要24小時全天候錄制監控,可以優先使用MPEG-4.2的編解碼方式。
           
videoWriter = cv2.VideoWriter(out_root,fourcc,fps,(1280,960))
           
success = cap.isOpened()
while (success):
	success,frame = cap.read()
	print("Read a new frame:",success)
	if not success:
		break
	frame = cv2.resize(frame,(1280,960))
	videoWriter.write(frame)
videoWriter.release()