问题描述
当原始视频中有特定条件时,我需要触发视频播放
示例: 我有一个使用开放式简历播放的视频。 在该视频中,当某个条件为真时,我希望另一个视频弹出并开始播放。
鉴于第一个视频将继续播放而没有任何问题。
这不起作用, 使用:
cap=cv2.VideoCapture(path)
while(cap.isopen()):
ret,frame=cap.read()
if(condition):
cap2=cv2.VideoCapture(path2)
while(cap2.isopen()):
ret2,frame2=cap2.read()
cv2.imshow("2nd video",frame2)
cv2.imshow('1st video',frame)
解决方法
您应在VideoCapture
循环之前初始化两个while
类。
import cv2
cap1 = cv2.VideoCapture("/Movies/B/ex1.mp4")
cap2 = cv2.VideoCapture("/Movies/B/ex2.mp4")
假设您的condition
是:
-
在第一个视频的前5帧之后播放第二个视频。
-
因此,我初始化了
count
变量-
count = 0
-
-
然后检查是否打开了第一个视频并播放。
-
while cap1.isOpened(): ret1,frm1 = cap1.read() if ret1: cv2.imshow("frm1",frm1) cv2.waitKey(1) else: break count += 1 cv2.destroyAllWindows()
-
-
现在,我们将添加
condition
。在应用条件条件之前,我们将第二帧设置为None
。如果条件成立,则从cap2
变量中获取输入-
while cap1.isOpened(): ret1,frm1 = cap1.read() if ret1: # condition if count > 5: if cap2.isOpened(): _,frm2 = cap2.read() if frm2 is not None: cv2.imshow("frm2",frm2) cv2.waitKey(3) if frm1 is not None: cv2.imshow("frm1",frm1) cv2.waitKey(3) count += 1 cv2.destroyAllWindows()
-
输出:
请注意,您不必使用cv2.waitKey(1)
。我用它来检查我的代码是否正常工作。
代码
import cv2
cap1 = cv2.VideoCapture("b/b19.mp4")
cap2 = cv2.VideoCapture("b/b22.mp4")
count = 0
frm2 = None
while cap1.isOpened():
ret1,frm1)
cv2.waitKey(3)
count += 1
cv2.destroyAllWindows()
第二个选项
您还可以通过使用Queue结构,使用FileVideoStream
类来加快视频编码,解码和显示操作。结果,FileVideoStream
同时处理所有操作。其中VideoCapture
类在帧编码,解码或显示期间阻止了整个应用程序。
import cv2
from imutils.video import FileVideoStream
cap1 = FileVideoStream("b/b19.mp4").start()
cap2 = FileVideoStream("b/b22.mp4").start()
count = 0
frm2 = None
while cap1.more():
frm1 = cap1.read()
if count > 5:
if cap2.more():
frm2 = cap2.read()
if frm2 is not None:
cv2.imshow("frm2",frm2)
cv2.waitKey(3)
if frm1 is not None:
cv2.imshow("frm1",frm1)
cv2.waitKey(3)
count += 1
cv2.destroyAllWindows()