搜索具有开始和结束持续时间(以秒为单位)的数组(视频)以查找完整的视频


search an array (videos) with start and end duration ( in seconds) to find the full length video

我有一系列持续时间为开始和结束秒的视频剪辑。这些视频剪辑具有与背景相同的音频。我想抓取一组剪辑,这些剪辑应该有合适的或尽可能接近的秒数,这样它就可以形成一个完整的视频。我的目标是找到短片,并将它们与原始音频合并为背景。这是一种配音。因此,我需要将视频中的间隙数量保持在最低限度。例如,我有以下剪辑阵列:

Array
(
    [0] => Array
        (
            [start_sec] => 0
            [end_sec] => 28
            [clip_id] => 1
        )
    [1] => Array
        (
            [start_sec] => 0
            [end_sec] => 193
            [clip_id] => 4
        )
    [2] => Array
        (
            [start_sec] => 0
            [end_sec] => 18
            [clip_id] => 5
        )
    [3] => Array
        (
            [start_sec] => 0
            [end_sec] => 193
            [clip_id] => 6
        )
    [4] => Array
        (
            [start_sec] => 0
            [end_sec] => 31
            [clip_id] => 10
        )
    [5] => Array
        (
            [start_sec] => 0
            [end_sec] => 13
            [clip_id] => 11
        )
    [6] => Array
        (
            [start_sec] => 0
            [end_sec] => 9
            [clip_id] => 12
        )
    [7] => Array
        (
            [start_sec] => 10
            [end_sec] => 21
            [clip_id] => 0
        )
    [8] => Array
        (
            [start_sec] => 22
            [end_sec] => 171
            [clip_id] => 3
        )
    [9] => Array
        (
            [start_sec] => 29
            [end_sec] => 58
            [clip_id] => 2
        )
    [10] => Array
        (
            [start_sec] => 59
            [end_sec] => 60
            [clip_id] => 0
        )
    [11] => Array
        (
            [start_sec] => 61
            [end_sec] => 72
            [clip_id] => 7
        )
)

在上面的数组中,我需要抓住紧密的组合,你可以看到下面,0-9 10-21和22-171之间没有秒的间隔,所以这很好。

[6] => Array
        (
            [start_sec] => 0
            [end_sec] => 9
            [clip_id] => 12
        )
    [7] => Array
        (
            [start_sec] => 10
            [end_sec] => 21
            [clip_id] => 0
        )
    [8] => Array
        (
            [start_sec] => 22
            [end_sec] => 171
            [clip_id] => 3
        )

或者这个

[0] => Array
        (
            [start_sec] => 0
            [end_sec] => 28
            [clip_id] => 1
        )
 [9] => Array
        (
            [start_sec] => 29
            [end_sec] => 58
            [clip_id] => 2
        )
[10] => Array
        (
            [start_sec] => 59
            [end_sec] => 60
            [clip_id] => 0
        )
    [11] => Array
        (
            [start_sec] => 61
            [end_sec] => 72
            [clip_id] => 7
        )

我知道我们不可能总是找到最好的,因为会有很多剪辑和组合,但我需要找到足够好的来制作一个主视频。任何指导或帮助都将不胜感激,因为我已经在这方面花了很多时间:)

这是一个尝试从起点最大化片段总长度的方法,如您在示例中所示,片段的结束和开始时间之间只允许1秒的间隙,可以根据需要进行调整(例如,扩大最大间隙或返回更多组合)。此示例假设列表按start_sec排序,并且仅测试从start_sec = 0:开始的路径

$data = Array
(
    0 => Array
        (
            'start_sec' => 0,
            'end_sec' => 28,
            'clip_id' => 1
        ),
    1 => Array
        (
            'start_sec' => 0,
            'end_sec' => 193,
            'clip_id' => 4
        ),
    2 => Array
        (
            'start_sec' => 0,
            'end_sec' => 18,
            'clip_id' => 5
        ),
    3 => Array
        (
            'start_sec' => 0,
            'end_sec' => 193,
            'clip_id' => 6
        ),
    4 => Array
        (
            'start_sec' => 0,
            'end_sec' => 31,
            'clip_id' => 10
        ),
    5 => Array
        (
            'start_sec' => 0,
            'end_sec' => 13,
            'clip_id' => 11
        ),
    6 => Array
        (
            'start_sec' => 0,
            'end_sec' => 9,
            'clip_id' => 12
        ),
    7 => Array
        (
            'start_sec' => 10,
            'end_sec' => 21,
            'clip_id' => 0
        ),
    8 => Array
        (
            'start_sec' => 22,
            'end_sec' => 171,
            'clip_id' => 3
        ),
    9 => Array
        (
            'start_sec' => 29,
            'end_sec' => 58,
            'clip_id' => 2
        ),
    10 => Array
        (
            'start_sec' => 29,
            'end_sec' => 53,
            'clip_id' => 8
        ),
    11 => Array
        (
            'start_sec' => 59,
            'end_sec' => 60,
            'clip_id' => 9
        ),
    12 => Array
        (
            'start_sec' => 61,
            'end_sec' => 72,
            'clip_id' => 7
        )
);

function gap($i,$j,&$arr){
  return $arr[$j]['start_sec'] - $arr[$i]['end_sec'];
}
function length($i,&$arr){
  return $arr[$i]['end_sec'] - $arr[$i]['start_sec'];
}
$n = count($data);
function f($i,$prev,$len,&$arr,$clips){
  global $n;
  if ($i == $n){
    return [$len,$clips];
  }
  if (gap($prev,$i,$arr) != 1){
    return f($i + 1,$prev,$len,$arr,$clips);
  } else {
    list($a,$ac) = f($i + 1,$i,$len + length($i,$arr),$arr,$clips);
    list($b,$bc) = f($i + 1,$prev,$len,$arr,$clips);
    if ($a > $b){
      array_splice($ac,1,0,$i);
      return [$a,$ac];
    } else {
      return [$b,$bc];
    }
  }
}
$i = 0;
while ($data[$i]['start_sec'] == 0){
  echo json_encode(f($i + 1,$i,length($i,$data),$data,[$i++])) . "'n";
}

输出:

[69,[0,9,11,12]]
[193,[1]]
[18,[2]]
[193,[3]]
[31,[4]]
[13,[5]]
[169,[6,7,8]]

下面的脚本将按照您喜欢的顺序对视频片段进行排序。它应该做你想做的事。使用PHP MultiSort。

 <?PHP
/**
**Sample Array DATA I BUILT TO TEST IT
**/
    $data = array
    (
      array(
            'start_sec' => 0,
            'end_sec' => 28,
            'clip_id' => 1,
            ),
      array(
        'start_sec' => 29,
        'end_sec' => 58,
        'clip_id' => 2,
        ),
        array(
        'start_sec' => 61,
        'end_sec' => 72,
        'clip_id' => 7,
        ),
      array(
        'start_sec' => 59,
        'end_sec' => 60,
        'clip_id' => 0,
        ),
        array(
        'start_sec' =>79,
        'end_sec' => 85,
        'clip_id' => 0,
        ),
        array(
        'start_sec' => 73,
        'end_sec' => 78,
        'clip_id' => 0,
        ),
    );
    // Gets the list
    foreach ($data as $key => $row) {
        $start_sec[$key]  = $row['start_sec'];
        $end_sec[$key] = $row['end_sec'];
    }
    // Sort the data
    array_multisort($start_sec, SORT_ASC, $end_sec, SORT_ASC, $data);

    var_dump($data);