En el panorama digital actual, ofrecer contenido de video de alta calidad en una variedad de dispositivos y condiciones de red es más importante que nunca. Ya sea que esté desarrollando una plataforma de transmisión, un portal de aprendizaje en línea, una aplicación de redes sociales o cualquier aplicación que requiera reproducción de video, la transmisión de video sin interrupciones es esencial para una experiencia de usuario óptima.
La automatización de la conversión de vídeo mediante un servicio de codificación basado en la nube le permite generar transmisiones adaptables sin esfuerzo, lo que garantiza la mejor calidad de vídeo para sus usuarios y, al mismo tiempo, reduce las complejidades de la infraestructura. Exploremos cómo puede implementar esta solución para satisfacer las demandas de su aplicación. Nuestro objetivo es crear una solución que sea fácil de implementar, que no requiera mantenimiento y que admita una base de usuarios en crecimiento.
Nos centraremos en HLS (HTTP Live Streaming), uno de los protocolos de transmisión de vídeo más populares. HLS utiliza codificación y segmentación: el vídeo original se codifica en varias versiones con diferentes tasas de bits y resoluciones. Estas versiones codificadas se dividen en fragmentos pequeños, normalmente de entre 2 y 10 segundos de duración, y cada fragmento se almacena como un archivo individual. A continuación, se crean listas de reproducción: primero, se genera una lista de reproducción para cada versión codificada del vídeo, que contiene las URL de los fragmentos individuales.
A continuación, se crea una única lista de reproducción maestra, que hace referencia a las diferentes versiones de la transmisión (y sus listas de reproducción correspondientes) junto con sus resoluciones y tasas de bits. Esta configuración permite que las aplicaciones cliente seleccionen la transmisión óptima en función de factores como la resolución del dispositivo del cliente, el tamaño de la ventana gráfica y las condiciones de la red, lo que garantiza que solo se descarguen los segmentos necesarios.
Hay muchas herramientas disponibles para crear transmisiones HLS a partir de videos. Estas incluyen ejecutar FFmpeg directamente o usar servicios basados en la nube para manejar la conversión y evitar la administración de la infraestructura. Algunos ejemplos de estos servicios incluyen AWS Elemental MediaConvert, Google Cloud Transcoder, Bitmovin y otros. En esta publicación, nos centraremos en MediaConvert. A continuación, se muestra un posible flujo de trabajo para convertir automáticamente videos cargados a HLS y poner las transmisiones a disposición de los usuarios. A medida que avanza en el flujo de trabajo, consulte el diagrama adjunto, donde se etiqueta cada paso.
Un usuario carga un video en un depósito S3 usando la aplicación cliente web o móvil.
El evento ObjectCreate en el depósito de S3 de cargas de video activa una función Lambda. Esta función crea un trabajo MediaConvert utilizando la configuración proporcionada y luego sale (no espera a que se complete la conversión de video). La API MediaConvert ofrece varias configuraciones, que incluyen selección de códec, tasa de bits, calidad, procesamiento de audio y más. También puede generar múltiples versiones de la transmisión con diferentes configuraciones de compresión, como 360p, 720p, 1080p, etc.
Si bien la selección de la configuración de codificación está fuera del alcance de esta publicación, el ejemplo de código incluye un trabajo de empaquetado HLS básico con una representación a una tasa de bits de 1 Mbps. La configuración se puede ampliar fácilmente para cumplir con los requisitos de cada aplicación. En cuanto a los permisos de IAM, esta función necesita acceso de lectura al depósito S3 de origen, acceso de escritura al depósito S3 de destino y acceso a la API MediaConvert.
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', }
MediaConvert procesa el video y genera listas de reproducción HLS y segmentos de video en el contenedor de salida S3. El contenedor de salida está conectado a una CDN que almacena en caché las listas de reproducción y los segmentos de video. En este ejemplo, usamos Cloudfront, pero se puede usar cualquier CDN que sea compatible con S3.
El evento ObjectCreate activa otra función Lambda en el contenedor de salida. Se adjunta un filtro de nombre de objeto a ese activador para garantizar que la función solo se ejecute cuando se crea un archivo de lista de reproducción (se ignoran los archivos de segmento).
Esta función agrega la URL de la lista de reproducción al registro de medios en la base de datos. La capa de almacenamiento está fuera del alcance de esta publicación, por lo que en el ejemplo de código, simplemente se imprime la 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', }
Cuando los usuarios abren el video en la interfaz de usuario de la aplicación cliente, esta recupera el registro multimedia de la base de datos mediante la API. Este registro multimedia contiene la URL de la lista de reproducción principal.
El reproductor de video obtiene la lista de reproducción maestra de la CDN y decide qué transmisión reproducir según factores como el tamaño de la ventana gráfica, la resolución de la pantalla, las condiciones de la red, etc. Luego obtiene la lista de reproducción de la transmisión y los segmentos de video de la CDN y comienza a reproducir el video.
Esta solución es muy fácil de implementar y no requiere mantenimiento. En cuanto a la escalabilidad para muchos usuarios, es importante tener en cuenta que, de forma predeterminada, los trabajos de MediaConvert se agregan a una sola cola que puede procesar entre 100 y 200 videos simultáneamente (según la región). Se pueden crear colas adicionales (hasta 10 por región) y se pueden asignar prioridades a los trabajos cuando se agregan a las colas. También existe una opción para solicitar aumentos de cuota a AWS.
En conclusión, automatizar la conversión de video mediante servicios basados en la nube como AWS Elemental MediaConvert es una forma eficaz de ofrecer contenido de transmisión de alta calidad en todos los dispositivos sin la carga de tener que administrar una infraestructura compleja. Este enfoque no solo simplifica el proceso de codificación de video, sino que también mejora la escalabilidad, lo que garantiza que su plataforma pueda manejar la creciente demanda.
Al aprovechar herramientas como S3, funciones Lambda y CloudFront junto con MediaConvert, puede generar y entregar de manera eficiente transmisiones HLS adaptables, brindando a los usuarios una experiencia de visualización optimizada.