python--openCV--视频处理

时间:2024-03-08 11:39:36

 

编码格式

视频容器中,一般有视频和音频数据,它们采取的编码方式不一样。

视频常见的编码方式通常有: x264、h264、mpeg-4

音频常见的编码方式通常有: mp3、AAC、flac

编码的目的主要是为了高效存储和传输,如果你不采用编码压缩的话,那么视频可以看做是一系列的图片序列,体积会非常大

FPS 帧率

我们读初中物理时,大概了解过电影画面一秒钟 24 帧,其实对应的就是 24 fps,frame per second,有些手机有高速摄像的功能,原理就是能够 1 秒钟拍摄 960 张图片,然后用正常的速度放映出来,所以细节比较多。fps 越高,细节越好,体验也越好,但是文件容量也越高

 

 播放:

import cv2
cap = cv2.VideoCapture("1.mp4")  #打开视频
while (1):
    ret, frame = cap.read()  # 读取一帧视频
    # ret 读取了数据就返回True,没有读取数据(已到尾部)就返回False
    # frame 返回读取的视频数据--一帧数据
    cv2.imshow("capture", frame)  # 显示视频帧

    if cv2.waitKey(40) & 0xFF == ord(\'q\'):  # 等候40ms,播放下一帧,或者按q键退出
        break
cap.release()  # 释放视频流
cv2.destroyAllWindows() # 关闭所有窗口

 

写入视频文件:

import cv2

cap = cv2.VideoCapture("1.mp4")
ret, frame = cap.read()
height=frame.shape[0]
width=frame.shape[1]
fps = cap.get(cv2.CAP_PROP_FPS)  #返回视频的fps--帧率
size=cap.get(cv2.CAP_PROP_FRAME_WIDTH)  #返回视频的宽,等同于frame.shape[1]
size1=cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  #返回视频的高,等同于frame.shape[0]


video = cv2.VideoWriter(\'2.mp4\', cv2.VideoWriter_fourcc(\'m\', \'p\', \'4\', \'v\'), fps, (width,height)) #创建视频流对象
"""
参数1 即将保存的文件路径
参数2 VideoWriter_fourcc为视频编解码器
    fourcc意为四字符代码(Four-Character Codes),顾名思义,该编码由四个字符组成,下面是VideoWriter_fourcc对象一些常用的参数,注意:字符顺序不能弄混
    cv2.VideoWriter_fourcc(\'I\', \'4\', \'2\', \'0\'),该参数是YUV编码类型,文件名后缀为.avi 
    cv2.VideoWriter_fourcc(\'P\', \'I\', \'M\', \'I\'),该参数是MPEG-1编码类型,文件名后缀为.avi 
    cv2.VideoWriter_fourcc(\'X\', \'V\', \'I\', \'D\'),该参数是MPEG-4编码类型,文件名后缀为.avi 
    cv2.VideoWriter_fourcc(\'T\', \'H\', \'E\', \'O\'),该参数是Ogg Vorbis,文件名后缀为.ogv 
    cv2.VideoWriter_fourcc(\'F\', \'L\', \'V\', \'1\'),该参数是Flash视频,文件名后缀为.flv
    cv2.VideoWriter_fourcc(\'m\', \'p\', \'4\', \'v\')    文件名后缀为.mp4
参数3 为帧播放速率
参数4 (width,height)为视频帧大小
"""
while (1):
    ret, frame = cap.read()
    cv2.imshow("capture", frame)
    video.write(frame)   # 向视频文件写入一帧--只有图像,没有声音

    if cv2.waitKey(40) & 0xFF == ord(\'q\'):  # 等候40ms,播放下一帧,或者按q键退出
        break
cap.release()  # 释放视频流
cv2.destroyAllWindows()   # 关闭所有窗口