View a markdown version of this page

Transmita vídeo usando CloudFront - FSx para ONTAP

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Transmita vídeo usando CloudFront

Los flujos de trabajo multimedia suelen almacenar contenido acabado (archivos de vídeo bajo demanda (VOD), paquetes HTTP Live Streaming (HLS), imágenes y gráficos, en un volumen de FSx para ONTAP en el que los editores, productores y sistemas de automatización escriben mediante NFS o SMB.

Con un punto de acceso Amazon S3 conectado al volumen FSx for ONTAP, CloudFront puede servir contenido directamente desde el volumen. Los editores y los sistemas de producción publican en el volumen a través de NFS o SMB como siempre lo han hecho, CloudFront obtienen el contenido a través del punto de acceso y los espectadores lo reciben desde la ubicación perimetral más cercana. CloudFront

En este tutorial, codificará un vídeo de muestra como un paquete de tasa de bits adaptativa HLS, cargará la salida en un punto de acceso conectado a un volumen FSx para ONTAP, configurará una CloudFront distribución con control de acceso de origen para que los espectadores no puedan evitarlo y acceder directamente al volumen y verificará que la transmisión se reproduce de principio CloudFront a fin.

nota

Este tutorial tarda aproximadamente entre 40 y 60 minutos en completarse. Los Servicios de AWS usuarios incurren en cargos por los recursos que cree. Si completa todos los pasos, incluida la sección de limpieza, con prontitud, el coste previsto será inferior a 1 dólar en la zona este de EE. UU. (Virginia del Norte) Región de AWS. Esta estimación no incluye los cargos continuos del FSx para el propio volumen de ONTAP.

Cómo funciona el patrón

El flujo de solicitudes es:

  • El reproductor de un espectador (navegador, aplicación móvil, televisor inteligente) solicita la lista de reproducción maestra del HLS al CloudFront dominio.

  • CloudFront comprueba su caché perimetral. En caso de error, CloudFront firma una solicitud con Signature Version 4 (SiGv4) con su control de acceso de origen (OAC) y la reenvía al punto de conexión Amazon S3 del punto de acceso.

  • El punto de acceso autoriza la solicitud en función de su política de acceso, que permite que el principal del CloudFront servicio abarque su distribución, y devuelve el objeto solicitado desde el volumen FSx for ONTAP.

  • CloudFront guarda en caché la respuesta en el borde y la devuelve al espectador.

Los paquetes HLS combinan dos tipos de archivos que se benefician de diferentes políticas de caché:

  • Las listas de reproducción (.m3u8) describen qué segmentos componen la transmisión. Usa un Cache-Control TTL corto para poder publicar listas de reproducción actualizadas rápidamente.

  • Los segmentos (.ts) contienen el vídeo y el audio codificados. Una vez escrito, el contenido de un segmento nunca cambia, así que usa un TTL largo e inmutableCache-Control.

Requisitos previos

  • Un volumen FSx para ONTAP con un punto de acceso Amazon S3 conectado. El punto de acceso debe tener un origen en una red de Internet para CloudFront poder acceder a él. Para obtener instrucciones, consulte Creación de un punto de acceso.

  • AWS CLI versión 2 instalada y configurada con credenciales que pueden crear CloudFront distribuciones, controles de acceso de origen y políticas de puntos de acceso.

  • FFmpeg se instaló localmente para codificar el vídeo de muestra en HLS.

  • Un archivo de vídeo fuente. Este tutorial utiliza el tráiler de Sintel de la Fundación Blender, un clip de 52 segundos en 1080p publicado con Creative Commons.

Paso 1: Codifica el vídeo fuente como un paquete HLS

Utilice FFmpeg para producir un paquete HLS de tres variantes a 360p, 720p y 1080p con velocidades de bits exageradas (OTT) realistas. El paquete resultante incluye una lista de reproducción maestra que hace referencia a las listas de reproducción por variante, cada una de las cuales incluye segmentos de transmisión de transporte de cuatro segundos.

  1. Descarga el vídeo original.

    $ mkdir -p ~/media && cd ~/media curl -sSL -o sintel-1080p.mp4 \ https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
  2. Codifique el vídeo en HLS con tres variantes de tasa de bits adaptativa.

    $ mkdir hls && cd hls ffmpeg -i ../sintel-1080p.mp4 \ -filter_complex "[0:v]split=3[v1][v2][v3]; \ [v1]scale=w=640:h=360[v1out]; \ [v2]scale=w=1280:h=720[v2out]; \ [v3]scale=w=1920:h=1080[v3out]" \ -map "[v1out]" -c:v:0 libx264 -b:v:0 800k -maxrate:v:0 856k -bufsize:v:0 1200k \ -map "[v2out]" -c:v:1 libx264 -b:v:1 3000k -maxrate:v:1 3200k -bufsize:v:1 4500k \ -map "[v3out]" -c:v:2 libx264 -b:v:2 5500k -maxrate:v:2 5900k -bufsize:v:2 8250k \ -preset veryfast -g 48 -keyint_min 48 -sc_threshold 0 \ -map a:0 -map a:0 -map a:0 -c:a aac -b:a:0 96k -b:a:1 128k -b:a:2 128k \ -f hls -hls_time 4 -hls_playlist_type vod -hls_flags independent_segments \ -hls_segment_filename "stream_%v/seg_%03d.ts" \ -master_pl_name master.m3u8 \ -var_stream_map "v:0,a:0,name:360p v:1,a:1,name:720p v:2,a:2,name:1080p" \ "stream_%v/playlist.m3u8"

    El comando genera un árbol de directorios con una lista de reproducción maestra, tres listas de reproducción variantes y los segmentos del flujo de transporte para cada variante.

    hls/ ├── master.m3u8 ├── stream_360p/ │ ├── playlist.m3u8 │ ├── seg_000.ts │ └── ... ├── stream_720p/ │ ├── playlist.m3u8 │ ├── seg_000.ts │ └── ... └── stream_1080p/ ├── playlist.m3u8 ├── seg_000.ts └── ...

Paso 2: Cargue el paquete HLS en el punto de acceso

Carga el paquete dos veces: una para las listas de reproducción con un TTL corto y otra para los segmentos con un TTL largo e inmutable. Content-TypeEs importante establecer la configuración correcta: la mayoría de los reproductores requieren application/vnd.apple.mpegurl «para» y «para». .m3u8 video/mp2t .ts

access-point-aliasSustitúyalo por el alias de tu punto de acceso.

$ # Playlists: short TTL, m3u8 content type aws s3 cp ~/media/hls/ "s3://access-point-alias/content/sintel/" \ --recursive --exclude "*" --include "*.m3u8" \ --content-type "application/vnd.apple.mpegurl" \ --cache-control "max-age=60" # Segments: long immutable TTL, ts content type aws s3 cp ~/media/hls/ "s3://access-point-alias/content/sintel/" \ --recursive --exclude "*" --include "*.ts" \ --content-type "video/mp2t" \ --cache-control "max-age=31536000,immutable"

Compruebe que ambos archivos se cargaron con los tipos de contenido y los encabezados de caché esperados.

$ aws s3api head-object --bucket access-point-alias \ --key content/sintel/master.m3u8 \ --query '{ContentType:ContentType,CacheControl:CacheControl}'

Paso 3: Crea un control de acceso al origen

Un control de acceso de origen (OAC) permite CloudFront firmar las solicitudes enviadas a tu punto de acceso para que solo CloudFront puedas recuperar objetos. Sin el OAC, los espectadores podrían evitarlo CloudFront solicitando objetos directamente desde el punto final del punto de acceso.

$ aws cloudfront create-origin-access-control \ --origin-access-control-config \ 'Name=fsxn-media-oac,SigningProtocol=sigv4,SigningBehavior=always,OriginAccessControlOriginType=s3'

Tenga en cuenta los Id en la respuesta. Lo usará en el siguiente paso.

Paso 4: Crear la distribución CloudFront

Cree una CloudFront distribución con el alias del punto de acceso como dominio de origen. Use la política de caché CachingOptimized administrada, que respeta Cache-Control los encabezados que configuró en el paso 2.

  1. Guarde la siguiente configuración en un archivo denominadodist.json, sustituyendo los marcadores de posición.

    { "CallerReference": "fsxn-media-1", "Comment": "FSx for ONTAP media delivery", "Enabled": true, "DefaultRootObject": "", "Origins": { "Quantity": 1, "Items": [{ "Id": "fsxn-ap", "DomainName": "access-point-alias.s3.region.amazonaws.com", "S3OriginConfig": {"OriginAccessIdentity": ""}, "OriginAccessControlId": "oac-id", "ConnectionAttempts": 3, "ConnectionTimeout": 10 }] }, "DefaultCacheBehavior": { "TargetOriginId": "fsxn-ap", "ViewerProtocolPolicy": "redirect-to-https", "AllowedMethods": { "Quantity": 2, "Items": ["GET", "HEAD"], "CachedMethods": {"Quantity": 2, "Items": ["GET", "HEAD"]} }, "Compress": true, "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6" }, "PriceClass": "PriceClass_100", "ViewerCertificate": {"CloudFrontDefaultCertificate": true} }
    nota

    PriceClass_100usa ubicaciones de CloudFront borde solo en América del Norte y Europa, lo que reduce el costo de este tutorial. Para una cobertura perimetral global, cambie el valor aPriceClass_All. Para obtener más información, consulte Elegir la clase de precio para una CloudFront distribución.

  2. Cree la distribución.

    $ aws cloudfront create-distribution --distribution-config file://dist.json \ --query 'Distribution.{Id:Id,DomainName:DomainName,ARN:ARN}'

    Anote el ID de distribución, el ARN y el nombre de dominio en la respuesta. La distribución tarda aproximadamente cinco minutos en implementarse. Puede continuar con el paso 5 mientras se despliega.

Paso 5: Adjunte una política de puntos de acceso que permita CloudFront

La política de puntos de acceso otorga al CloudFront responsable del servicio el permiso para leer objetos, en función de su distribución específica mediante la AWS:SourceArn condición.

  1. Guarde la siguiente política en un archivo denominadoap-policy.json, sustituyendo los marcadores de posición.

    { "Version": "2012-10-17", "Statement": [{ "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": {"Service": "cloudfront.amazonaws.com"}, "Action": "s3:GetObject", "Resource": "arn:aws:s3:region:account-id:accesspoint/access-point-name/object/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::account-id:distribution/distribution-id" } } }] }
  2. Adjunte la política al punto de acceso.

    $ aws s3control put-access-point-policy \ --account-id account-id \ --name access-point-name \ --policy file://ap-policy.json

Paso 6: Verificar la reproducción

Espere a que la distribución alcance Deployed el estado.

$ aws cloudfront get-distribution --id distribution-id \ --query 'Distribution.Status'

Busca la lista de reproducción maestra. CloudFront

$ curl -sS "https://distribution-domain/content/sintel/master.m3u8"

La respuesta debe enumerar las tres variantes.

#EXTM3U #EXT-X-VERSION:6 #EXT-X-STREAM-INF:BANDWIDTH=1031744,RESOLUTION=640x360,CODECS="avc1.64001e,mp4a.40.2" stream_360p/playlist.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=3497301,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2" stream_720p/playlist.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=6311285,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2" stream_1080p/playlist.m3u8

Comprueba los encabezados de respuesta para ver si el tipo de contenido, el control de la caché y el estado de la caché son correctos.

$ curl -sSI "https://distribution-domain/content/sintel/stream_1080p/seg_000.ts"

Se muestra content-type: video/mp2t una respuesta correcta y un x-cache encabezado que indica si la respuesta proviene del borde o del origen. cache-control: max-age=31536000,immutable

Por último, reproduce la transmisión de principio a fin con FFmpeg para confirmar que todos los segmentos se han obtenido y decodificado correctamente.

$ ffprobe -v error \ -show_entries stream=codec_name,width,height \ -show_entries format=duration \ "https://distribution-domain/content/sintel/master.m3u8"

También puedes abrir la URL de la lista de reproducción maestra en Safari o VLC, o incrustarla en una página web con un JavaScript reproductor como hls.js.

Extender el patrón

  • Usa un dominio personalizado con HTTPS. Solicita un certificado ACM para tu dominio, adjúntalo a la distribución y añade un registro CNAME que apunte al CloudFront dominio. Para obtener instrucciones, consulta Cómo usar direcciones URL personalizadas con. CloudFront

  • Proteja el contenido premium con URL firmadas o cookies firmadas. Para el contenido que requiere autorización (servicios de suscripción, vistas previas de acceso anticipado, contenido geodelimitado), utiliza CloudFront URL firmadas o cookies firmadas. Consulte Publicar contenido privado con URL firmadas y cookies firmadas.

  • Invalida la caché cuando publiques contenido nuevo. Cuando sustituyas una lista de reproducción o subas un nuevo paquete HLS, úsalo aws cloudfront create-invalidation para eliminar las versiones antiguas de CloudFront los bordes. En el caso de los segmentos inmutables con TTL largos, la invalidación no suele ser necesaria, ya que los nombres de los archivos de los segmentos son únicos para cada paquete.

  • Habilite CORS para los reproductores basados en navegador. Si un reproductor HLS basado en un navegador de un dominio diferente carga tu transmisión, añade Access-Control-Allow-Origin encabezados a las respuestas mediante una política de encabezados de respuesta. CloudFront

  • Registra las solicitudes de los espectadores. Habilite el registro CloudFront estándar o los registros en tiempo real para capturar las solicitudes de análisis, facturación o detección de usos indebidos de los espectadores.

Resolución de problemas

403 ¿Prohibido CloudFront

Falta la política de punto de acceso, no incluye el principal de CloudFront servicio o la AWS:SourceArn condición hace referencia a un ARN de distribución incorrecto. Verifique la política aws s3control get-access-point-policy y confirme que el ARN de distribución coincide con el de su aws cloudfront create-distribution respuesta.

El reproductor carga la lista de reproducción maestra pero no la reproduce

Compruebe que los archivos de segmentos Content-Type: video/mp2t y las listas de reproducción síContent-Type: application/vnd.apple.mpegurl. Algunos reproductores rechazan los segmentos con tipos de contenido genéricos. Re-upload con la --content-type bandera correcta.

Las nuevas listas de reproducción tardan en llegar a los espectadores

CloudFront guarda en caché las listas de reproducción para el TTL establecido junto a tu Cache-Control encabezado. Si necesitas un TTL más corto, vuelve a cargar la lista de reproducción con un max-age valor menor o crea una invalidación. Los segmentos no tienen este problema porque su contenido no cambia.

x-cache: Miss from cloudfronten cada solicitud

Esto es normal la primera vez que un espectador de una región solicita un archivo. CloudFront busca desde el origen en caso de error y guarda en caché la respuesta para el TTL. Se devuelven las solicitudes posteriores del mismo archivo desde esa ubicación de borde. Hit from cloudfront

Se deniega el acceso directo al punto de acceso

Esto es normal. La OAC requiere SigV4-signed solicitudes del principal del CloudFront CloudFront servicio y la política del punto de acceso restringe el acceso al mismo. Los espectadores solo pueden acceder al contenido a través del dominio de distribución.

Limpieza

Deshabilita y elimina la distribución y, a continuación, elimina los recursos restantes. La distribución debe estar deshabilitada antes de poder eliminarla, lo que lleva unos minutos.

Para deshabilitarla se necesitan dos valoresget-distribution-config: el valor ETag for --if-match y el DistributionConfig objeto interno for --distribution-config (la respuesta completa también contiene la ETag, que update-distribution no acepta).

$ # Capture the current ETag and the DistributionConfig body GET_ETAG=$(aws cloudfront get-distribution-config --id distribution-id \ --query 'ETag' --output text) aws cloudfront get-distribution-config --id distribution-id \ --query 'DistributionConfig' --output json \ | jq '.Enabled = false' > dist-updated.json # Disable the distribution. The response returns a new ETag. UPDATE_ETAG=$(aws cloudfront update-distribution --id distribution-id \ --if-match "$GET_ETAG" --distribution-config file://dist-updated.json \ --query 'ETag' --output text) # Wait for Status to reach Deployed before deleting. aws cloudfront get-distribution --id distribution-id \ --query 'Distribution.Status' # Delete the distribution using the ETag from the update call. aws cloudfront delete-distribution --id distribution-id \ --if-match "$UPDATE_ETAG" # Fetch the OAC ETag, then delete the OAC. OAC_ETAG=$(aws cloudfront get-origin-access-control --id oac-id \ --query 'ETag' --output text) aws cloudfront delete-origin-access-control --id oac-id \ --if-match "$OAC_ETAG" aws s3control delete-access-point-policy \ --account-id account-id --name access-point-name aws s3 rm "s3://access-point-alias/content/sintel/" --recursive