0

我正在使用 PHP 代码通过 AWS CloudFront 的签名 URL 检索 .m3u8 的内容。

我无法播放其中的块 .ts 文件,因为您还需要签署他们的 URL。

所以,使用 PHP 代码,我重写了 .m3u8 的内容

<?php
    $resourceKey = 'https://abcdefg.cloudfront.net/abcdef-1234.MOV_1000k*';
    $expires = time() + 172800;
    $customPolicy = <<<POLICY
{
    "Statement": [
        {
            "Resource": "{$resourceKey}",
            "Condition": {
                "DateLessThan": {"AWS:EpochTime": {$expires}}
            }
        }
    ]
}
POLICY;
    $signedUrl = $cloudFrontClient->getSignedUrl([
        'url' => $resourceKey,
        'policy' => $customPolicy,
        'private_key' => public_path().'/pk-ABCDEFGHIJ.pem',
        'key_pair_id' => 'ABCDEFGHIJ'
    ]);
    $signedUrl = str_replace('*', '.m3u8', $signedUrl);

    // get contents of the file and the query string
    $content = file_get_contents($signedUrl);
    parse_str(parse_url($signedUrl)['query'], $params);
    $qs = "?Policy=".$params['Policy']."&Signature=".$params['Signature']."&Key-Pair-Id=".$params['Key-Pair-Id'];

    // rewriting process
    $replaceThis = array(".m3u8", ".ts");
    $withThisValue = array(".m3u8".$qs, ".ts".$qs);
    $content = str_replace($replaceThis, $withThisValue, $content);
?>

我能够在 .m3u8 文件中签署 .ts 。但现在的问题是,如何$content在不使用 file_put_contents 下载文件内容的情况下使用 VideoJS 将其转换为可播放的 HTML5 视频?我不想将它保存在目录中。只是将其转换为 blob 数据或对其进行解码并播放它 像这样的东西。这可能吗?

<!DOCTYPE html>
<html>
<head>
    <title>My Site</title>
</head>
<body>

    <video id='hls-example' class="video-js vjs-default-skin" width="640" height="480" controls>
        <source src="<?php echo $content; ?>" type="application/x-mpegURL">
        Your browser does not support the video tag.
    </video>

    <script src="https://vjs.zencdn.net/7.2.3/video.js"></script>
    <script>
        var player1 = videojs('hls-example');
    </script>
</body>
</html>

PS:我试过 AWS Lambda Edge。但是,当 m3u8 文件中有很多块 .ts 时,它不起作用。它返回一个超过 40KB 查看器请求配额的错误。

4

0 回答 0