比较两个视频,然后减少差异

问题描述

我有2个视频文件,它们具有相同的内容,但来自不同的来源。他们在“剪辑”和语言配音方面略有不同,这意味着一个人可能会比另一个人错过一个镜头。

我有另一种被配音的语言,它对于一个文件(称为A)的时间是正确的,并且由于裁切方式的不同,另一个文件的命名也略有偏差(称为B)。

问题是,“ A”的质量也很低,而“ B”的质量也更好,并且用原始语言配音。

我基本上需要确定配音与B匹配的时间。

为此,我需要在2个视频之间找到丢失的镜头/其他镜头,所以我知道在哪里剪切。

如果我只有一对文件,但是有20对文件,这是现实的!我想使搜索自动进行,基本上比较两个文件在不同时间点的位置,并找出它们之间的差异。

我该怎么做?我在Windows上使用什么软件?

由于文件A具有其他配音语言,因此比较方法应足够准确以检测内容差异。

解决方法

假设单个框架的质量尺寸相同,则可以使用如下方法:

  1. 从两个视频的第一帧开始
  2. 从两个视频中读取框架并进行比较
  3. 如果相同,请返回上一步并在下一帧中阅读
  4. 如果不同,则存储接下来要读取的视频A的下一帧x的帧号,直到找到与视频B中的当前名相匹配的帧(如果视频A有多余的帧)
  5. 如果您在上面的步骤中达到x却没有找到匹配项,请继续阅读视频B的下x帧,直到找到与视频A中当前名气匹配的帧(如果视频B有多余的帧框架)
  6. 假设您在上面找到了一个匹配项,然后回到步骤2,继续浏览两个视频文件

X的值将控制您准备搜索多远才能找到相同的帧。

带有OpenCV的Python将是实现此目的的一种语言/工具的常见选择-一个框架示例,用于显示打开视频文件并进行比较(未经测试或破坏,只是为了提供示例指导):

import cv2
import numpy as np
from skimage.measure import compare_ssim as ssim

capture = cv2.VideoCapture("videoA.mp4")
capture2 = cv2.VideoCapture("videoB.mp4")
simlarityIndexThreshold =  // the value you want as your threshold

while True:
    f,frameA = capture.read()
    f2,frameB = capture2.read()

    if (frameA.empty() || frameB.emnpty()
        break
    
    simlarityIndex = ssim(farmeA,frameB)
    if(simlarityIndex < simlarityIndexThreshold):
        //Frames are differnt so do your work to skip ahead here

    

在OpenCV中,有多种方法可以比较图像之间的相似性,因此值得您进行搜索来决定要使用的图像-此处记录了上述方法:https://scikit-image.org/docs/stable/api/skimage.measure.html#compare-ssim