視訊二次裁剪時間計算出原片的時間片段演算法

seth-shi發表於2021-07-16

視訊裁剪:

  • 最近遇到了一個如下的需求, 對原片進行裁剪
  • 運營第一次裁剪視訊, 會對視訊進行刪減(掐掉片頭片尾之類), (此處忽略視訊的總時長, 單位秒)
    • [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 協議》,轉載必須註明作者和本文連結
當神不再是我們的信仰,那麼信仰自己吧,努力讓自己變好,不辜負自己的信仰!

相關文章