我正在使用 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 查看器请求配额的错误。