最好理解Tik Tok的时光倒流原理,也就是倒放视频。如果你是掌握了PR或者AE的用户,那么视频播放肯定是得心应手的。不过我们今天要做的是用OpenCV程序实现视频播放效果(当然PR和AE的效果是这个代码的原理)。
接下来,让我们一步步掌握整个视频倒带和部分倒带的操作代码。
实现视频整体倒放要先了解时间反转的具体实现,我们不妨先实现一个简单的整体反转。对于整体回放来说,比部分回放简单,只需读取视频,然后保存每一帧,再向后遍历写入视频文件保存即可。
具体代码如下:
# video全反 def video _ inverted(video filename,outputFileName): cap = cv2。视频捕获(视频文件名) fps = cap.get(cv2。CAP _ PROP _ FPS) width = int(CAP . get(cv2。CAP _ PROP _ FRAME _ WIDTH)) height = int(CAP . get(cv2。CAP _ PROP _ FRAME _ HEIGHT)) fourcc = cv2。video writer _ fourcc(* & # 39;MJPG & # 39) videoWriter = cv2。video writer(output filename+& # 34;。avi & # 34,fourcc,fps,(width,height)) frame _ list =[] while(cap . iso pened()): ret,frame = cap . read() if ret: frame _ list . append(frame) c = cv2 . wait key(1) if c = = 27: break else: break for frame _ list中的框架_ _ main _ _ & # 34: video _ Inverted(& # 34;45.mp4 & # 34,"输出& # 34;)运行后,我们的视频会倒放,效果如下:
一些视频在Tik Tok和影视作品中倒放也是很常见的,比如影视常用的回忆,然后加快进度等等。那么视频中间部分怎么反过来呢?
答案很简单,我们分为以下两步:
1.首先,设置要倒放的视频的帧数的起点和终点。2.然后设置三个列表,一个保存倒放前的帧号图像不倒放,一个保存倒放后的帧号图像不倒放。3.最后,拼接反转前后的图像。这样视频中的一部分视频就反了。
接下来,我们将把上述步骤翻译成代码,如下所示:
#视频部分反转 def video _ Part _ inverted(video filename,outputFileName): cap = cv2。视频捕获(视频文件名) fps = cap.get(cv2。CAP _ PROP _ FPS) width = int(CAP . get(cv2。CAP _ PROP _ FRAME _ WIDTH)) height = int(CAP . get(cv2。CAP _ PROP _ FRAME _ HEIGHT)) fourcc = cv2。video writer _ fourcc(* & # 39;MJPG & # 39) videoWriter = cv2。video writer(output filename+& # 34;。avi & # 34,fourcc,fps,(width,Height)) frame _ list _ start =[]#反转前的图像列表 frame_list_end = [] #反转后的图像列表 inverted_list = [] #要反转的图像列表[/h Fps _ start = 66 # Fps _ End = 150 #倒带的结束帧 I = 0 while (cap .是open()): ret,frame = cap。read() if ret: if I & gt = fps _ start且i & lt= fps _ end: inverted _ list . append(frame) elif I & lt;fps _ start: frame _ list _ start . append(frame) elif I & gt;fps _ end: frame _ list _ end . append(frame) I+= 1 c = cv2 . wait key(1) if c = = 27: break else: break for frame _ list _ start: video writer . write(frame) for frame in inverted _ list[:-1]: _ _ main _ _ & # 34: video _ part _ Inverted(& # 34;45.mp4 & # 34, "输出1 & # 34;)原理已经说清楚了,相信这段代码也很好理解,这里就不赘述了,运行后的图片也不放了。有兴趣的读者可以自己找个视频测试一下。