paint-brush
Як конвертувати відео в HLS для потокового передавання через Інтернет і мобільні пристрої за допомогою AWS Elemental MediaConvertза@andrei9735
273 показання

Як конвертувати відео в HLS для потокового передавання через Інтернет і мобільні пристрої за допомогою AWS Elemental MediaConvert

за Andrei12m2024/10/06
Read on Terminal Reader

Надто довго; Читати

Незалежно від того, чи розробляєте ви потокову платформу, онлайн-навчальний портал або будь-яку програму, яка вимагає відтворення відео, безперебійне потокове відео має важливе значення.
featured image - Як конвертувати відео в HLS для потокового передавання через Інтернет і мобільні пристрої за допомогою AWS Elemental MediaConvert
Andrei HackerNoon profile picture

У сучасному цифровому середовищі доставка високоякісного відеовмісту на різні пристрої та умови мережі є більш важливою, ніж будь-коли. Незалежно від того, чи розробляєте ви потокову платформу, онлайн-навчальний портал, програму для соціальних мереж чи будь-яку іншу програму, яка потребує відтворення відео, безперебійне потокове відео має важливе значення для оптимальної взаємодії з користувачем.


Автоматизація перетворення відео за допомогою хмарної служби кодування дозволяє без зусиль генерувати адаптивні потоки, забезпечуючи найкращу якість відео для ваших користувачів, одночасно зменшуючи складність інфраструктури. Давайте дослідимо, як можна реалізувати це рішення, щоб відповідати вимогам вашої програми. Наша мета — створити рішення, яке легко розгортати, не потребує обслуговування та підтримує зростаючу базу користувачів.

Кілька слів про ЗСЖ

Ми зосередимося на HLS (HTTP Live Streaming), одному з найпопулярніших протоколів потокового відео. HLS використовує кодування та сегментацію: вихідне відео кодується в кілька версій з різними бітрейтами та роздільною здатністю. Потім ці закодовані версії поділяються на невеликі частини, як правило, тривалістю від 2 до 10 секунд, причому кожна частина зберігається як окремий файл. Потім створюються списки відтворення: спочатку створюється список відтворення для кожної закодованої версії відео, що містить URL-адреси окремих фрагментів.


Далі створюється єдиний головний список відтворення, який посилається на різні версії потоку (і їхні відповідні списки відтворення) разом із їх роздільною здатністю та бітрейтом. Це налаштування дозволяє клієнтським програмам вибирати оптимальний потік на основі таких факторів, як роздільна здатність пристрою клієнта, розмір вікна перегляду та умови мережі, забезпечуючи завантаження лише необхідних сегментів.

Рішення з AWS Elemental Mediaconvert

Існує багато інструментів для створення потоків HLS з відео. До них відноситься безпосередній запуск FFmpeg або використання хмарних служб для обробки перетворення й уникнення керування інфраструктурою. Прикладами таких сервісів є AWS Elemental MediaConvert, Google Cloud Transcoder, Bitmovin та інші. У цій публікації ми зосередимося на MediaConvert. Нижче наведено можливий робочий процес для автоматичного перетворення завантажених відео в HLS і надання потоків доступності користувачам. Під час проходження робочого процесу звертайтеся до доданої схеми, де позначено кожен крок.


  1. Користувач завантажує відео в сегмент S3 за допомогою мобільного або веб-клієнта.


  2. Функція Lambda запускається подією ObjectCreate у сегменті Video Uploads S3. Ця функція створює завдання MediaConvert за допомогою наданої конфігурації, а потім виходить (вона не чекає завершення перетворення відео). MediaConvert API пропонує різні параметри, зокрема вибір кодека, бітрейт, якість, обробку звуку тощо. Він також може генерувати кілька версій потоку з різними налаштуваннями стиснення, наприклад 360p, 720p, 1080p тощо.


    Хоча вибір конфігурації кодування виходить за рамки цієї публікації, зразок коду включає базове завдання пакування HLS з одним відтворенням із бітрейтом 1 Мбіт/с. Конфігурація може бути легко розширена відповідно до вимог кожної програми. Що стосується дозволів IAM, для цієї функції потрібен доступ на читання до вихідного відра S3, доступ на запис до цільового відра S3 і доступ до MediaConvert API.


 import boto3 import re output_bucket_name = 'converted-videos-bucket' mediaconvert_role_arn = 'arn:aws:iam::123456789012:role/MediaConvertRole' # output bucket access s3_client = boto3.client('s3') mediaconvert_client = boto3.client('mediaconvert') hls_main_playlist_suffix = '-hls.m3u8' # regex used to normalize the object key for the client request token client_request_token_symbols_to_skip = r'[^a-zA-Z0-9-_]' def lambda_handler(event, context): # get S3 bucket name and object key from the event bucket_name = event['Records'][0]['s3']['bucket']['name'] object_key = event['Records'][0]['s3']['object']['key'] # also used as media id # normalize the object key for the client request token client_request_token_obj_key = re.sub(client_request_token_symbols_to_skip, '_', object_key) # call MediaConvert to transcode the video create_job_response = mediaconvert_client.create_job( Role=mediaconvert_role_arn, ClientRequestToken=client_request_token_obj_key, Settings={ 'Inputs': [ { 'FileInput': f's3://{bucket_name}/{object_key}', 'AudioSelectors': { 'Audio Selector 1': { 'DefaultSelection': 'DEFAULT', }, }, } ], 'OutputGroups': [ { 'Name': 'DefaultOutputGroup', 'OutputGroupSettings': { 'Type': 'HLS_GROUP_SETTINGS', 'HlsGroupSettings': { 'Destination': f's3://{output_bucket_name}/{object_key}-hls', 'DirectoryStructure': 'SUBDIRECTORY_PER_STREAM', 'SegmentLength': 5, 'MinSegmentLength': 2, 'SegmentsPerSubdirectory': 500, 'ProgressiveWriteHlsManifest': 'DISABLED', }, }, 'Outputs': [ { 'NameModifier': '-h264', 'ContainerSettings': { 'Container': 'M3U8', }, 'VideoDescription': { 'CodecSettings': { 'Codec': 'H_264', 'H264Settings': { 'RateControlMode': 'VBR', 'Bitrate': 1000000, }, }, }, 'AudioDescriptions': [ { 'AudioSourceName': 'Audio Selector 1', 'CodecSettings': { 'Codec': 'AAC', 'AacSettings': { 'Bitrate': 96000, 'CodingMode': 'CODING_MODE_2_0', 'SampleRate': 48000, }, }, }, ], }, ], } ], }, ) print('Created a MediaConvert job:', create_job_response) return { 'statusCode': 200, 'body': 'OK', }


  1. MediaConvert обробляє відео та створює списки відтворення HLS і сегменти відео у вихідному сегменті S3. Відро виводу підключено до CDN, який кешує списки відтворення та сегменти відео. У цьому прикладі ми використовуємо Cloudfront, але можна використовувати будь-який CDN, сумісний із S3.


  2. Ще одна функція Lambda запускається подією ObjectCreate у вихідному сегменті. Фільтр імені об’єкта додається до цього тригера, щоб гарантувати, що функція запускається лише тоді, коли створюється файл списку відтворення (файли сегментів ігноруються).

Фільтр імені об’єкта в лямбда-тригері: запускайте функцію лише після створення основного файлу списку відтворення.

Ця функція додає URL-адресу списку відтворення до медіа-запису в базі даних. Рівень зберігання виходить за рамки цієї публікації, тому в прикладі коду URL просто друкується.


 import boto3 s3_client = boto3.client('s3') def lambda_handler(event, context): # this function is triggered only when a playlist file # with object key that looks like this '<video_id>-hls.m3u8' # is created in the S3 bucket # get object key from the event object_key = event['Records'][0]['s3']['object']['key'] # extract video id from the object key video_id = object_key.replace('-hls.m3u8', '') print(f'HLS playlist {object_key} created for video {video_id}') # TODO: update the video record in the database return { 'statusCode': 200, 'body': 'OK', }



  1. Коли користувачі відкривають відео в інтерфейсі клієнтської програми, клієнтська програма отримує медіа-запис із бази даних за допомогою API. Цей медіа-запис містить URL-адресу основного списку відтворення.


  2. Відеопрогравач отримує головний список відтворення з CDN і вирішує, який потік відтворювати на основі таких факторів, як розмір вікна перегляду, роздільна здатність екрана, умови мережі тощо. Потім він отримує список відтворення потоку та сегменти відео з CDN і починає відтворення відео .


Це рішення дуже просте в розгортанні та не вимагає обслуговування. Що стосується масштабованості для багатьох користувачів, важливо зазначити, що за замовчуванням завдання MediaConvert додаються до однієї черги, яка може обробляти 100–200 відео одночасно (залежно від регіону). Можна створювати додаткові черги (до 10 на регіон) і призначати завданням пріоритети, коли вони додаються до черг. Існує також можливість вимагати збільшення квоти від AWS.


Підсумовуючи, автоматизація перетворення відео за допомогою хмарних служб, таких як AWS Elemental MediaConvert, є ефективним способом доставки високоякісного потокового вмісту на пристрої без тягаря керування складною інфраструктурою. Цей підхід не тільки спрощує процес кодування відео, але й покращує масштабованість, гарантуючи, що ваша платформа може впоратися зі зростаючим попитом.


Використовуючи такі інструменти, як S3, функції Lambda та CloudFront у поєднанні з MediaConvert, ви можете ефективно створювати та доставляти адаптивні потоки HLS, забезпечуючи користувачам оптимізоване враження від перегляду.

L O A D I N G
. . . comments & more!

About Author

Andrei HackerNoon profile picture
Software Engineer, Cloud Solutions Architect

ПОВІСИТИ БИРКИ

ЦЯ СТАТТЯ БУЛА ПРЕДСТАВЛЕНА В...