View a markdown version of this page

Video streamen mit CloudFront - FSx für ONTAP

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Video streamen mit CloudFront

Medien-Workflows speichern in der Regel fertige Inhalte — Video-on-Demand-Dateien (VOD), HTTP-Live-Streaming-Pakete (HLS), Bilder und Grafiken — auf einem FSx for ONTAP-Volume, auf das Redakteure, Produzenten und Automatisierungssysteme mit NFS oder SMB schreiben.

Mit einem Amazon S3 S3-Zugriffspunkt, der an das FSx for ONTAP-Volume angeschlossen ist, CloudFront können Inhalte direkt vom Volume aus bereitgestellt werden. Redakteure und Produktionssysteme veröffentlichen auf dem Volume wie gewohnt über NFS oder SMB, CloudFront holen Inhalte über den Access Point ab und Zuschauer erhalten die Inhalte vom nächstgelegenen Edge-Standort. CloudFront

In diesem Tutorial kodieren Sie ein Beispielvideo als HLS-Paket mit adaptiver Bitrate, laden die Ausgabe auf einen Access Point hoch, der an ein FSx for ONTAP-Volume angeschlossen ist, konfigurieren eine CloudFront Distribution mit Origin-Zugriffskontrolle, sodass Zuschauer das Volume nicht direkt erreichen können, und überprüfen, ob der Stream durchgehend abgespielt wird. CloudFront

Anmerkung

Die Bearbeitung dieses Tutorials dauert etwa 40 bis 60 Minuten. Für die AWS-Services verwendeten Ressourcen fallen Gebühren für die von Ihnen erstellten Ressourcen an. Wenn Sie alle Schritte, einschließlich des Abschnitts Aufräumen, umgehend abschließen, belaufen sich die voraussichtlichen Kosten im Osten der USA (Nord-Virginia) AWS-Region auf weniger als 1$. In dieser Schätzung sind die laufenden Gebühren für das FSx for ONTAP-Volumen selbst nicht enthalten.

Wie funktioniert das Muster

Der Anforderungsablauf ist:

  • Der Player eines Zuschauers (Browser, mobile App, Smart-TV) fordert die HLS-Master-Playlist von der CloudFront Domain an.

  • CloudFront überprüft seinen Edge-Cache. Wenn ein Fehler auftritt, CloudFront signiert er eine Anfrage mithilfe von Signature Version 4 (Sigv4) mit seiner Origin Access Control (OAC) und leitet sie an den Amazon S3 S3-Endpunkt für den Access Point weiter.

  • Der Access Point autorisiert die Anfrage anhand seiner Zugriffsrichtlinie, sodass der CloudFront Service Principal auf Ihre Distribution beschränkt ist, und gibt das angeforderte Objekt vom FSx for ONTAP-Volume zurück.

  • CloudFront speichert die Antwort am Edge im Cache und gibt sie an den Viewer zurück.

HLS-Pakete kombinieren zwei Arten von Dateien, die von unterschiedlichen Cache-Richtlinien profitieren:

  • Playlisten (.m3u8) beschreiben, aus welchen Segmenten der Stream besteht. Verwenden Sie eine kurze Cache-Control TTL, damit Sie aktualisierte Playlisten schnell veröffentlichen können.

  • Segmente (.ts) enthalten das kodierte Video und Audio. Einmal geschrieben, ändert sich der Inhalt eines Segments nie. Verwenden Sie daher eine lange, unveränderliche TTLCache-Control.

Voraussetzungen

  • Ein FSx for ONTAP-Volume mit angeschlossenem Amazon S3 S3-Zugriffspunkt. Der Access Point muss über einen Ursprung im Internet-Netzwerk verfügen, damit er erreicht CloudFront werden kann. Detaillierte Anweisungen finden Sie unter Erstellen eines Zugriffspunkts.

  • AWS CLI Version 2 wurde installiert und mit Anmeldeinformationen konfiguriert, mit denen CloudFront Distributionen, Zugriffskontrollen für die Herkunft und Zugriffspunktrichtlinien erstellt werden können.

  • FFmpeg wurde lokal installiert, um das Beispielvideo in HLS zu kodieren.

  • Eine Quellvideodatei. Dieses Tutorial verwendet den Sintel-Trailer der Blender Foundation, einen 52-Sekunden-1080p-Clip, der unter Creative Commons veröffentlicht wurde.

Schritt 1: Kodieren Sie das Quellvideo als HLS-Paket

Verwenden Sie FFmpeg, um ein HLS-Paket mit drei Varianten bei 360p, 720p und 1080p mit realistischen Over-the-Top- (OTT) -Bitraten zu erstellen. Das resultierende Paket enthält eine Master-Playlist, die auf Playlisten pro Variante verweist, von denen jede vier Sekunden lange Transport-Stream-Segmente auflistet.

  1. Laden Sie das Quellvideo herunter.

    $ mkdir -p ~/media && cd ~/media curl -sSL -o sintel-1080p.mp4 \ https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
  2. Kodieren Sie das Video mit drei Varianten mit adaptiver Bitrate in HLS.

    $ 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"

    Der Befehl erzeugt einen Verzeichnisbaum mit einer Master-Playlist, drei Varianten-Playlisten und den Transport-Stream-Segmenten für jede 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 └── ...

Schritt 2: Laden Sie das HLS-Paket auf den Access Point hoch

Laden Sie das Paket zweimal hoch — einmal für Playlisten mit einer kurzen TTL und einmal für Segmente mit einer langen, unveränderlichen TTL. Die richtige Einstellung Content-Type ist wichtig: Die meisten Spieler benötigen application/vnd.apple.mpegurl für und für.m3u8. video/mp2t .ts

Ersetzen Sie es access-point-alias durch den Alias Ihres Access Points.

$ # 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"

Stellen Sie sicher, dass beide Dateien mit den erwarteten Inhaltstypen und Cache-Headern hochgeladen wurden.

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

Schritt 3: Erstellen Sie eine Origin-Zugriffskontrolle

Mit einer Origin-Zugriffskontrolle (OAC) können Anfragen CloudFront an Ihren Access Point signiert werden, sodass nur Objekte abgerufen CloudFront werden können. Ohne OAC könnten Zuschauer das umgehen, CloudFront indem sie Objekte direkt vom Access Point-Endpunkt aus anfordern.

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

Beachten Sie die Id in der Antwort. Sie werden ihn im nächsten Schritt verwenden.

Schritt 4: Erstellen Sie die Verteilung CloudFront

Erstellen Sie eine CloudFront Distribution mit dem Access Point-Alias als Ursprungsdomäne. Verwenden Sie die CachingOptimized verwaltete Cache-Richtlinie, die die in Schritt 2 festgelegten Cache-Control Header berücksichtigt.

  1. Speichern Sie die folgende Konfiguration in einer Datei mit dem Namen und ersetzen Sie dist.json dabei die Platzhalter.

    { "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} }
    Anmerkung

    PriceClass_100verwendet CloudFront Edge-Standorte nur in Nordamerika und Europa, wodurch die Kosten für dieses Tutorial gesenkt werden. Ändern Sie den Wert für eine globale Kantenabdeckung inPriceClass_All. Weitere Informationen finden Sie unter Auswahl der Preisklasse für eine CloudFront Verteilung.

  2. Erstellen Sie die Verteilung.

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

    Notieren Sie sich die Vertriebs-ID, den ARN und den Domainnamen in der Antwort. Die Bereitstellung der Verteilung dauert ungefähr fünf Minuten. Während der Bereitstellung können Sie mit Schritt 5 fortfahren.

Schritt 5: Fügen Sie eine Zugriffspunktrichtlinie hinzu, die Folgendes ermöglicht CloudFront

Die Zugriffspunktrichtlinie gewährt dem CloudFront Dienstprinzipal die Berechtigung, Objekte zu lesen, die auf Ihre spezifische Verteilung unter Verwendung der AWS:SourceArn Bedingung beschränkt sind.

  1. Speichern Sie die folgende Richtlinie in einer Datei mit dem Namen und ersetzen Sie ap-policy.json dabei die Platzhalter.

    { "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. Hängen Sie die Richtlinie an den Access Point an.

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

Schritt 6: Überprüfen Sie die Wiedergabe

Warten Sie, bis die Verteilung den Deployed Status erreicht hat.

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

Rufen Sie die Master-Playlist über CloudFront ab.

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

In der Antwort sollten die drei Varianten aufgeführt sein.

#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

Überprüfen Sie die Antwortheader auf den korrekten Inhaltstyp, die Cachesteuerung und den Cachestatus.

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

Eine erfolgreiche Antwort zeigt content-type: video/mp2tcache-control: max-age=31536000,immutable, und eine x-cache Kopfzeile, die angibt, ob die Antwort vom Edge oder vom Ursprung kam.

Spielen Sie abschließend den Stream mit FFmpeg Ende an Ende ab, um zu überprüfen, ob alle Segmente korrekt abgerufen und dekodiert wurden.

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

Sie können die URL der Master-Playlist auch in Safari oder VLC öffnen oder sie mit einem Player wie hls.js in eine Webseite einbetten. JavaScript

Erweiterung des Musters

  • Verwenden Sie eine benutzerdefinierte Domain mit HTTPS. Fordern Sie ein ACM-Zertifikat für Ihre Domain an, fügen Sie es der Distribution bei und fügen Sie einen CNAME-Eintrag hinzu, der auf die CloudFront Domain verweist. Anweisungen finden Sie unter Benutzerdefinierte URLs verwenden mit. CloudFront

  • Schützen Sie Premium-Inhalte mit signierten URLs oder signierten Cookies. Verwenden CloudFront Sie signierte URLs oder signierte Cookies für Inhalte, für die eine Autorisierung erforderlich ist (Abonnementdienste, Early-Access-Vorschauen, geografisch abgegrenzte Inhalte). Weitere Informationen findest du unter Bereitstellung privater Inhalte mit signierten URLs und signierten Cookies.

  • Machen Sie den Cache ungültig, wenn Sie neue Inhalte veröffentlichen. Wenn Sie eine Playlist ersetzen oder ein neues HLS-Paket hochladen, verwenden Sie diese Option, aws cloudfront create-invalidation um die alten Versionen von CloudFront Edges zu entfernen. Bei unveränderlichen Segmenten mit langen TTLs ist eine Invalidierung normalerweise nicht erforderlich, da die Namen der Segmentdateien pro Paket eindeutig sind.

  • Aktivieren Sie CORS für browserbasierte Player. Wenn ein browserbasierter HLS-Player auf einer anderen Domain Ihren Stream lädt, fügen Sie mithilfe einer Access-Control-Allow-Origin Antwort-Header-Richtlinie Header zu Antworten hinzu. CloudFront

  • Viewer-Anfragen protokollieren. Aktivieren Sie die CloudFront Standardprotokollierung oder Echtzeitprotokolle, um Zuschaueranfragen zur Analyse, Abrechnung oder Missbrauchserkennung zu erfassen.

Fehlerbehebung

403 Verboten von CloudFront

Die Zugriffspunktrichtlinie fehlt, enthält den CloudFront Dienstprinzipal nicht, oder die AWS:SourceArn Bedingung verweist auf den falschen Verteilungs-ARN. Überprüfen Sie die Richtlinie mit aws s3control get-access-point-policy und stellen Sie sicher, dass der Verteilungs-ARN mit dem in Ihrer aws cloudfront create-distribution Antwort übereinstimmt.

Der Player lädt die Master-Playlist, kann sie aber nicht abspielen

Vergewissern Sie sich, dass die Segmentdateien Content-Type: video/mp2t und die Playlisten dies getan habenContent-Type: application/vnd.apple.mpegurl. Manche Player lehnen Segmente mit generischen Inhaltstypen ab. Re-upload mit der richtigen --content-type Flagge.

Neue Playlisten brauchen Zeit, um Zuschauer zu erreichen

CloudFront speichert Playlisten für die TTL, die in deinem Cache-Control Header festgelegt wurden. Wenn du eine kürzere TTL benötigst, lade die Playlist mit einem kleineren max-age Wert erneut hoch oder erstelle eine Invalidierung. Bei Segmenten tritt dieses Problem nicht auf, da sich ihr Inhalt nicht ändert.

x-cache: Miss from cloudfrontauf jede Anfrage

Das ist normal, wenn ein Zuschauer in einer Region zum ersten Mal eine Datei anfordert. CloudFront ruft bei einem Fehlschlag vom Ursprung ab und speichert die Antwort für die TTL im Cache. Nachfolgende Anfragen nach derselben Datei von diesem Edge-Standort kehren zurück. Hit from cloudfront

Der direkte Zugriff auf den Access Point wurde verweigert

Das ist normal. Das OAC verlangt SigV4-signed Anfragen von CloudFront, und die Zugriffspunktrichtlinie schränkt den Zugriff auf den CloudFront Dienstprinzipal ein. Zuschauer können den Inhalt nur über die Distributionsdomäne erreichen.

Bereinigen

Deaktivieren und löschen Sie die Distribution und löschen Sie anschließend die verbleibenden Ressourcen. Die Distribution muss deaktiviert werden, bevor sie gelöscht werden kann. Dies dauert einige Minuten.

Für die Deaktivierung sind zwei Werte erforderlichget-distribution-config: ETag for --if-match und das innere DistributionConfig Objekt for --distribution-config (die vollständige Antwort enthält auch das ETag, update-distribution das nicht akzeptiert wird).

$ # 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