【问题标题】:combine two different length videos frame by frame so as they appear in one frame, kind of like video tiling逐帧组合两个不同长度的视频,使它们出现在一帧中,有点像视频平铺
【发布时间】:2016-01-04 21:26:54
【问题描述】:

我有两个长度不同但分辨率相同 (640,480) 的 h264 视频。我想逐帧组合它们,使得时间 T 的 video1 的帧 f1 和时间 T 的 video2 的帧 f2 出现在一帧侧面。所以最后你有一个视频,它是通过组合来自 video1 和 video2 的帧序列形成的。

我怎样才能使用这些解决方案来做到这一点:

  • 编程
  • 软件
  • ffmpeg

【问题讨论】:

  • 您应该向specific questions 解释您已经尝试过的内容。
  • 我不太明白你想做什么。你能提供一张你想要的图片吗?
  • 在 OpenCV 中:您生成的图像 Mat3b res 将为 1280x480。您可以将左边的地址设为Mat3b left(res(Rect(0,0,640,480)));,将右边的地址设为Mat3b right(res(Rect(640,0,640,480)));。然后您只需将帧复制到正确的位置:leftFrame.copyTo(left); rightFrame.copyTo(right)。在imshow 之后记得waitKey。要获得更好的答案,您需要缩小问题范围并发布您迄今为止尝试过的内容,否则过于宽泛。

标签: opencv ffmpeg video-capture video-processing


【解决方案1】:

我能够使用这个解决问题:

import cv2
import cv
import numpy as np

capture1 = cv2.VideoCapture("video1.h264")
capture2 = cv2.VideoCapture("video2.h264")

while True:
    ret1, frame1 = capture1.read()
    ret2, frame2 = capture2.read()

    h1, w1, d1 = capture1.get(cv.CV_CAP_PROP_FRAME_HEIGHT), capture1.get(cv.CV_CAP_PROP_FRAME_WIDTH), 3
    h2, w2, d2 = capture1.get(cv.CV_CAP_PROP_FRAME_HEIGHT), capture1.get(cv.CV_CAP_PROP_FRAME_WIDTH), 3

    vis = np.zeros((max(h1,h2), w1+w2, 3), np.uint8)
    if frame1 is None:
        frame1 = np.zeros((h1,w1,d1), np.uint8)
    if frame2 is None:
        frame2 = np.zeros((h2,w2,d2), np.uint8)

    vis[:h1, :w1, :d1] = frame1
    vis[:h2, w1:w1+w2, :d2] = frame2

    cv2.imshow('Merged Frame', vis)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break 

capture1.release()
capture2.release()
cv2.destroyAllWindows()

以上代码也解决了视频长度不同的问题。例如:说video1比video2长,那么video2边会变暗,直到video1结束。

但是还有一个问题是video2变暗后,video1的处理速度变慢了。另外,一旦两个视频都结束了,我应该如何打破循环?我试图使用提到的ret1, ret2 flags,但它们显然没有工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2017-12-13
    • 2019-12-31
    相关资源
    最近更新 更多