处理视频后我收到的文件要大得多。 MJPG fourcc编解码器是否正确压缩或者这应该发生?原始视频大小为2.51 mb,结果视频文件大小为16.8 mb。在此代码中,没有要引用的已处理图像,它使用与以前相同的图像,但尺寸增加。
这是我的代码。
import os
import cv2
width=960
height=540
fps=25.0
#video=cv2.VideoWriter('ntest\\video.avi',-1,1,(width,height))
fourcc=cv2.VideoWriter_fourcc(*'MJPG')
video = cv2.VideoWriter('ntest\\output.avi',fourcc, fps, (width,height))
cap = cv2.VideoCapture('in.mp4')
count = 0
prename="ntest\\frame"
extension=".jpg"
while cap.isOpened():
ret,frame = cap.read()
#after processing, replace frame with processed image
cv2.imshow('window-name',frame)
name=prename+str(count)+extension
cv2.imwrite(name, frame)
a=cv2.imread(name)
video.write(a)
os.remove(name) #deletes image file, only keeps video
count = count + 1
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cap.destroyAllWindows()
cv2.destroyAllWindows()
video.release()
答案 0 :(得分:2)
如果输入的mp4文件使用像h264这样的现代编解码器,那么mjpeg很可能会更大。 Mjpeg只是每帧的一系列jpeg图像,它不能利用图像中逐帧相同的区域,或者现代视频编解码器使用的任何预测编码
答案 1 :(得分:0)
在MPEG编解码器的情况下,只有I帧(关键帧)将具有(有点)完整的JPEG信息。在关键帧之间存在B或P帧,它们都是与其他帧相比的差分信息。 http://www.bretl.com/mpeghtml/pixtypes.HTM
帧IBBPBBP...BBIBBPBBP...BBIBBPBB...
的典型模式。在压缩得很好的MPEG4 / divx视频的情况下,通常会经过几秒钟直到视频流中出现关键帧。所有其他帧都是差分的。您可以注意到,当录制的某些颜色失真开始超过视图区域时,当视频流遇到I帧并且可以清空空间时突然出现伪影消失。
这些将是完全示例数据,并且基于MPEG2而不是MPEG4编码。 MPEG4比这更压缩。
http://www0.cs.ucl.ac.uk/teaching/GZ05/09-mpeg.pdf第11页:
| Type | Size (KB) | Compression |
| ------- | --------- | ----------- |
| I-frame | 50 | 10:1 |
| ------- | --------- | ----------- |
| B-frame | 25 | 20:1 |
| ------- | --------- | ----------- |
| P-frame | 10 | 50:1 |
| ------- | --------- | ----------- |
| Avg. | 18 | 29:1 |
这表明在MPEG2视频的情况下MJPEG大约是3倍。这意味着将~7.53 MB假设的MJPEG视频压缩为2.51 MB MPEG2视频。 MPEG4可以轻松实现比MPEG2多2倍的压缩(全部取决于编解码器设置),因此它可以将15-18MB MJPEG压缩为2.51 MB MPEG4。永远不要忘记压缩是有损的,所以有些信息会丢失。但在理想的情况下,人眼和耳朵不会识别数据丢失(阻塞,振铃......)的过多伪影。