使用Open CV同时打开两个视频? 2nd稍后开始

问题描述

当原始视频中有特定条件时,我需要触发视频播放

示例: 我有一个使用开放式简历播放的视频。 在该视频中,当某个条件为真时,我希望另一个视频弹出并开始播放。

鉴于第一个视频将继续播放而没有任何问题。

这不起作用, 使用:

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()
      

输出:


enter image description here

请注意,您不必使用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()