視訊裁剪:
- 最近遇到了一個如下的需求, 對原片進行裁剪
- 運營第一次裁剪視訊, 會對視訊進行刪減(掐掉片頭片尾之類), (此處忽略視訊的總時長, 單位秒)
[10, 15]
[20, 70]
- 以上的兩個片段會合併成一個新的視訊:
(15-10)+(70-20)=55
- 運營第二次裁剪視訊的時候, 會對第一次裁剪後的視訊裁剪(如刪除中間部分, 在之前的片頭片尾基礎上)
- 裁剪的時間應該用第一次裁剪的時間基礎上計算
- 實際的裁剪時間應該從原片上計算
說來複雜,用例子說明一下
$first = [
// F1
[10, 15],
// F2
[20, 70],
];
$second = [
// S1
[2, 3],
// S2
[4, 9],
// S3
[45, 55],
];
## 實際應該返回一個列表
$output = [
// S1 在 F1 得到片段
[12, 13]
// S2 在 F1 得到的片段
[14, 15]
// S2 在 F2 得到的片段
[20, 24]
// S3 在 F2 得到的片段
[60, 70]
];
- 經過上面的過程之後,拿到
$output
的結果, 再去原片裁剪即可.
程式碼如下
$first = [
[10, 15],
[20, 70],
];
$second = [
// 這個是第一段夠的
[2, 3],
// 第一段不夠, 用第二段來補全
[4, 9],
// 這個直接跳到第二段
[45, 55],
];
var_dump(makeSections($first, $second));
function makeSections(array $firstCutSections, array $secondCutSections) : array
{
// 不論是哪一個為空, 直接返回另外一個即可
if (empty($firstCutSections)) {
return $secondCutSections;
}
if (empty($secondCutSections)) {
return $firstCutSections;
}
$newSections = [];
foreach ($secondCutSections as $currSection) {
$usableSections = $firstCutSections;
$start = 0;
$usableLength = 0;
// 剩餘的長度
// 剩餘的開始對齊長度
$remainLength = $currSection[1] - $currSection[0];
$remainStart = $currSection[0];
while ($remainLength != 0) {
// 如果沒有可用的時間段, 取出一個來用
if ($usableLength == 0) {
$sec = array_shift($usableSections);
if (is_null($sec)) {
throw new Exception('第二次擷取的視訊比第一次長');
}
$usableLength = $sec[1] - $sec[0];
$start = $sec[0];
continue;
}
// 如果座標沒對齊, 那麼去對齊座標
if ($remainStart > 0) {
// 兩種情況
if ($remainStart > $usableLength) {
$remainStart -= $usableLength;
$start += $usableLength;
$usableLength = 0;
} else {
$usableLength -= $remainStart;
$start += $remainStart;
$remainStart = 0;
}
continue;
}
// 長度應該用哪一種
$contentLength = 0;
if ($remainLength > $usableLength) {
$contentLength = $usableLength;
$remainLength -= $usableLength;
$usableLength = 0;
} else {
$contentLength = $remainLength;
$usableLength -= $remainLength;
$remainLength = 0;
}
var_dump($contentLength);
// 取出每一端時間儲存
$newSections[] = [
$start,
$start + $contentLength,
];
}
}
return $newSections;
}
部落格原文www.shiguopeng.cn/archives/522
本作品採用《CC 協議》,轉載必須註明作者和本文連結