Я изо всех сил пытаюсь прочитать файл .m3u8 в Javascript и изменить его сегменты, чтобы они были подписаны Cloudfront для потоковой передачи содержимого hls.
const s3ObjectKey = `${folderName}/${folderName}.m3u8`;
const url = `${process.env.CLOUDFRONT_DOMAIN}/${s3ObjectKey}`;
const privateKey = fs.readFileSync(
new URL("../private_key.pem", import.meta.url),
{
encoding: "utf8",
}
);
const keyPairId = process.env.CLOUDFRONT_KEY_PAIR_ID;
const dateLessThan = new Date(new Date().getTime() + 60 * 60000);
const m3u8Url = cloudfrontSignedUrl({
url,
keyPairId,
dateLessThan,
privateKey,
});
После того, как я получу подписанный m3u8Url, мне нужно изменить его сегменты, чтобы они были подписаны.
Любая помощь будет оценена.





Форма ответа Блог AWS пост
import boto3
import os
KEY_PREFIX = os.environ.get('KEY_PREFIX')
S3_BUCKET = os.environ.get('S3_BUCKET')
SEGMENT_FILE_EXT = os.environ.get('SEGMENT_FILE_EXT', '.ts')
required_vars = [KEY_PREFIX, S3_BUCKET]
if not all(required_vars):
raise KeyError(f'Missing required environment variable/s. Required vars {required_vars}.')
s3 = boto3.client('s3')
def lambda_handler(event, context):
try:
s3_key = event['pathParameters']['proxy']
obj = s3.get_object(Bucket=S3_BUCKET, Key=s3_key)
body = obj['Body'].read().decode('utf-8')
qp = event['queryStringParameters']
params = ['?']
# reconstruct query param uri
[(params.append(p.replace(KEY_PREFIX, '') + '=' + qp[p] + "&")) for p in qp if KEY_PREFIX in p]
sign_params = ''.join(params).rstrip("&")
# append query params to each segment
resp_body = body.replace(SEGMENT_FILE_EXT, ''.join([SEGMENT_FILE_EXT, sign_params]))
return {
'statusCode': 200,
'body': resp_body
}
except Exception as e:
print(e)
return {'statusCode': 500, 'body': ''}
Давайте рассмотрим ключевые области в коде Python:
KEY_PREFIX переменная среды — это шаблон префикса, который Lambda использует для идентификации параметров запроса CloudFront. В моем примере это -ПРЕФИКС.S3_BUCKET переменная окружения имя корзины S3, к которой Lambda будет отправлять запрос на получение основного манифеста.Примечание. Для иллюстрации я использовал переменную среды, которая устанавливается, например, при создании лямбда-функции. Ты можешь измените эту часть, чтобы иметь логику поиска, что особенно полезно если у вас есть разные корзины S3, которые используются для хранения мультимедиа содержание.
SEGMENT_FILE_EXT расширение файла переменной среды вашего медиафайла. По умолчанию это .ts, вы можете переопределить значение, установив эту переменную среды в конфигурации функции Lambda.s3_key переменная — это путь к файлу в вашей корзине S3, представленный в виде URL-адреса, который используется клиентом для выполнения запроса. В моем примере URL-адрес — https://myapp.com/movies/movie_1/index.m3u8 , а ключ s3 — movie/movie_1/index.m3u8, что точно соответствует структуре папок корзины s3, как показано ранее на рисунке. 5. Следуя этому соглашению, при создании структуры папок S3 для URL-пути s3_key будет динамически получать правильный путь к файлу в корзине S3. Чтобы узнать больше об интеграции прокси-сервера Lambda, см. раздел Настройка интеграции прокси-сервера с прокси-ресурсом.sign_params переменная — это реконструированные параметры подписанного URL-адреса CloudFront.resp_body переменная — это окончательный измененный основной манифест, который возвращается клиенту. Функция замены добавляет параметры запроса URL-адреса, подписанного CloudFront, к каждому сегменту в файле манифеста. Окончательный результат присваивается переменной resp_body.Эта функция Lambda получает файл манифеста в его исходной форме из вашей корзины S3 и изменяет его таким образом, что когда проигрыватель отправляет запрос на получение следующего сегмента, запрос уже включает подписанные CloudFront параметры запроса URL-адреса. Это позволяет ограничить доступ к видеоконтенту на основе разрешений пользователя для каждого видео. Рисунок 6 иллюстрирует манифест до и после модификации.
Пробовали Шака Плеер?