opencv python播放视频和保存视频

本文介绍如何利用OpenCV库在Python中实现视频的播放和保存功能。文章详细展示了通过cv2.VideoCapture读取视频文件,获取视频帧数、宽度、高度等属性,并实时显示视频画面的过程。同时,还讲解了如何将视频帧翻转并保存为新的视频文件,包括设置输出格式、帧率及尺寸等关键步骤。
# -*- coding: utf-8 -*-

import numpy as np
import cv2

def playVideo(videoFile):
	cap = cv2.VideoCapture(videoFile)
	if cap.isOpened():
		print("Open ", videoFile, " success!")
	else:
		print("Open ", videoFile, " failed!")
		return
	#print(cap) # print cap address
	
	# cap.get(propId) 来获得视频的一些参数信息
	print("fps: ", cap.get(cv2.CAP_PROP_FPS))
	print("frame counts: ", cap.get(cv2.CAP_PROP_FRAME_COUNT))
	print("frame width: ", cap.get(cv2.CAP_PROP_FRAME_WIDTH))
	print("frame hight: ", cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
	
	#  cap.set(propId,value) 来修改
	
	while True:
		# Capture frame-by-frame
		ret, frame = cap.read()
		
		# cap.read() get a frame, if ret = false then frame is empty
		if not ret:
			break
		
		# Our operations on the frame come here
		gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
		
		# Display the resulting frame
		cv2.imshow(videoFile, frame)
		cv2.imshow('frame',gray)
		
        # q or ESC to exit
		if cv2.waitKey(1) & 0xFF == ord('q') or cv2.waitKey(1) & 0xFF == 27:
			break;
	
	# When everything done, release the capture
	cap.release()
	cv2.destroyAllWindows()

# 确保已经装了合适版本的 ffmpeg 或者 gstreamer
def saveVideo(videoFile):
	cap = cv2.VideoCapture(videoFile)
	if cap.isOpened():
		print("Open ", videoFile, " success!")
	else:
		print("Open ", videoFile, " failed!")
		return
	#print(cap) # print cap address

	width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
	height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
	# cap.get(propId) 来获得视频的一些参数信息
	print("fps: ", cap.get(cv2.CAP_PROP_FPS))
	print("frame counts: ", cap.get(cv2.CAP_PROP_FRAME_COUNT))
	print("frame width: ", width)
	print("frame hight: ", height)
	
	#  cap.set(propId,value) 来修改
	
	# Define the codec and create VideoWriter object
	# fourcc = cv2.VideoWriter_fourcc(*'XVID')
	fourcc = cv2.VideoWriter_fourcc(*'DIVX')
	out = cv2.VideoWriter('output.avi', fourcc, 20.0, (int(width),int(height)))
	if out.isOpened():
		print("Create output video success!")
	else:
		print("Create output video failed!")
	
	while cap.isOpened():
		# Capture frame-by-frame
		ret, frame = cap.read()
		
		# cap.read() get a frame, if ret = false then frame is empty
		if not ret:
			break
		
		# 上下翻转
		# frame = cv2.flip(frame,0)
		
		# 左右翻转
		frame = cv2.flip(frame,1)
		
		# write the flipped frame
		out.write(frame)
		
		cv2.imshow("frame", frame)
		if cv2.waitKey(1) & 0xFF == ord('q'):
			break;
	
	# When everything done, release the capture
	cap.release()
	out.release()
	cv2.destroyAllWindows()
	
def main():
	#videoFile = 0
	#videoFile = "F:\\dataSet\\video.avi"
	videoFile = "F:\\dataSet\\opencv33.mp4"
	#playVideo(videoFile)
	saveVideo(videoFile)

if __name__ == '__main__':
	main()

 

<think>好的,我现在需要帮用户解决如何使用PythonOpenCV读取视频文件并以压缩格式保存的问题。首先,我得回忆一下OpenCV中处理视频的相关知识,尤其是VideoCaptureVideoWriter的用法。 用户提到了压缩格式保存,所以关键点应该在于设置正确的编码器(FourCC)参数。根据引用[1][2]中的例子,用户可能已经知道VideoWriter的基本用法,但需要具体调整压缩参数。比如,FourCC码的选择,比如XVID、H264等,不同的编码器对应不同的压缩格式文件扩展名。比如,XVID通常用于AVI,而MP4V可能用于MP4。 接下来,我需要确保用户正确设置FourCC输出文件的参数。例如,使用cv2.VideoWriter_fourcc来定义编码器,然后创建VideoWriter对象时需要指定帧率、分辨率等。引用[1]中的代码示例使用了XVID编码,输出AVI文件,这可能是一个参考。但用户可能需要不同的格式,比如MP4,这时可能需要用MP4V的FourCC码。 另外,需要注意视频的尺寸是否与原始视频一致。如果用户读取的视频尺寸不一致,可能会导致保存失败。所以需要先获取原始视频的宽度高度,然后在VideoWriter中使用同样的尺寸。这可以通过cap.get(cv2.CAP_PROP_FRAME_WIDTH)等方法获取。 还有,帧率也需要保持一致,否则保存视频可能播放速度不对。同样用cap.get(cv2.CAP_PROP_FPS)来获取原始帧率。 还有可能遇到的问题是编码器不支持某些格式,或者参数设置不正确。这时候可能需要安装额外的编解码器,或者调整参数。例如,某些环境下H264可能需要额外的配置。 最后,用户可能需要示例代码来整合这些步骤。所以,我需要提供一个完整的代码示例,包括读取视频、处理每一帧、设置正确的FourCC、创建VideoWriter,并处理可能的异常情况,比如无法打开视频文件。 总结步骤应该是:1. 打开视频文件,2. 获取视频参数,3. 创建VideoWriter,4. 读取并写入帧,5. 释放资源。同时,要注意压缩格式的选择FourCC的对应关系,确保输出文件能够正确压缩并保存。</think>以下是使用PythonOpenCV实现视频读取、压缩并保存的完整步骤: ### 一、视频读取与压缩保存实现步骤 1. **视频读取** 使用`cv2.VideoCapture()`读取视频文件,需注意视频路径支持本地文件或网络流地址 2. **编码器配置** 通过`cv2.VideoWriter_fourcc()`指定视频编码格式,常见压缩编码器: - `XVID`: AVI格式,兼容性好 - `H264`: MP4格式,高压缩率 - `MJPG`: Motion-JPEG编码 3. **参数设置** 需要匹配原始视频的帧率、分辨率,可通过以下方式获取: ```python width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) ``` 4. **视频写入** 创建`cv2.VideoWriter`对象时需指定: - 输出文件名 - FOURCC编码 - 帧率(FPS) - 帧尺寸 ### 二、完整实现代码 ```python import cv2 # 读取视频文件 input_path = "input.mp4" cap = cv2.VideoCapture(input_path) # 获取视频参数 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) # 设置H.264编码器(MP4格式) fourcc = cv2.VideoWriter_fourcc(*'H264') # 或使用'MP4V' output_path = "compressed_output.mp4" # 创建VideoWriter对象 out = cv2.VideoWriter(output_path, fourcc, fps, (width, height)) while cap.isOpened(): ret, frame = cap.read() if not ret: break # 可在此处添加帧处理逻辑 # processed_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) out.write(frame) cap.release() out.release() cv2.destroyAllWindows() ``` ### 三、关键参数说明 1. **编码器选择**: - `H264`需要OpenCV编译时包含对应支持 - `XVID`兼容性更好但压缩率较低 - 可用`cap.getBackendName()`检查后端支持[^2] 2. **压缩优化**: - 降低分辨率:调整输出尺寸参数 - 调整帧率:降低输出FPS值 - 使用`cv2.IMWRITE_JPEG_QUALITY`设置压缩质量(0-100) 3. **常见问题处理**: - **无法写入文件**:检查路径写入权限 - **黑屏输出**:确认分辨率与原始视频一致 - **编码器错误**:尝试更换编码器类型 ### 四、扩展应用 结合引用[3]中的图像处理技术,可在写入前添加: - 直方图均衡化:`cv2.equalizeHist()` - 频域滤波:通过DFT变换实现图像增强 - 运动检测:背景差分法处理视频
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值