搜索具有开始和结束持续时间(以秒为单位)的数组(视频)以查找完整长度的视频
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
)
我知道我们并不总是能找到最好的,因为会有很多剪辑和很多组合,但我需要找到足够好的来构建一个主要视频。任何指导或帮助将不胜感激,因为我已经在这上面花了很多时间:)
下面的脚本将按照您喜欢的顺序对您的视频剪辑进行排序。它应该做你想做的。使用 PHP 多排序。
<?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);
这里有一些尝试最大化剪辑从起点开始的总长度,只允许剪辑的结束时间和开始时间之间有 1 秒的间隔,如您在示例中所示,可以根据需要进行调整(例如,扩大最大差距或 return 更多组合)。此示例假定列表按 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]]
我有一系列具有开始和结束秒持续时间的视频剪辑。这些视频剪辑具有与背景相同的音频。我想抓取一组应该具有适当或尽可能接近的秒数的剪辑,以便它可以形成完整的视频。我的目标是找到短片并将它们与原始音频合并为背景。它的一种配音。所以我需要将视频中的间隙数量保持在最低限度。例如,我有以下剪辑数组:
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
)
我知道我们并不总是能找到最好的,因为会有很多剪辑和很多组合,但我需要找到足够好的来构建一个主要视频。任何指导或帮助将不胜感激,因为我已经在这上面花了很多时间:)
下面的脚本将按照您喜欢的顺序对您的视频剪辑进行排序。它应该做你想做的。使用 PHP 多排序。
<?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);
这里有一些尝试最大化剪辑从起点开始的总长度,只允许剪辑的结束时间和开始时间之间有 1 秒的间隔,如您在示例中所示,可以根据需要进行调整(例如,扩大最大差距或 return 更多组合)。此示例假定列表按 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]]