

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
<a name="tutorial-stream-video-with-cloudfront"></a>

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
<a name="tutorial-cf-how-it-works"></a>

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 inmutable`Cache-Control`.

## Requisitos previos
<a name="tutorial-cf-prerequisites"></a>
+ 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](fsxn-creating-access-points.md).
+ 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](https://ffmpeg.org/) 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](https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4) 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
<a name="tutorial-cf-encode"></a>

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
   ```

1. 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
<a name="tutorial-cf-upload"></a>

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-Type`Es 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-alias}}Sustitú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
<a name="tutorial-cf-oac"></a>

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
<a name="tutorial-cf-distribution"></a>

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 denominado`dist.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_100`usa 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 a`PriceClass_All`. Para obtener más información, consulte [Elegir la clase de precio para una CloudFront distribución](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PriceClass.html).

1. 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
<a name="tutorial-cf-ap-policy"></a>

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 denominado`ap-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}}"
               }
           }
       }]
   }
   ```

1. 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
<a name="tutorial-cf-verify"></a>

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.](https://github.com/video-dev/hls.js)

## Extender el patrón
<a name="tutorial-cf-extending"></a>
+ **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](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-procedures.html). 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](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html).
+ **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
<a name="tutorial-cf-troubleshooting"></a>

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 cloudfront`en 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
<a name="tutorial-cf-clean-up"></a>

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 valores`get-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
```