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 kurzeCache-ControlTTL, 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.
-
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 -
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 --bucketaccess-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.
-
Speichern Sie die folgende Konfiguration in einer Datei mit dem Namen und ersetzen Sie
dist.jsondabei 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. -
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.
-
Speichern Sie die folgende Richtlinie in einer Datei mit dem Namen und ersetzen Sie
ap-policy.jsondabei 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" } } }] } -
Hängen Sie die Richtlinie an den Access Point an.
$aws s3control put-access-point-policy \ --account-idaccount-id\ --nameaccess-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 --iddistribution-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"
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-invalidationum 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-OriginAntwort-Header-Richtlinie Header zu Antworten hinzu. CloudFrontViewer-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:SourceArnBedingung verweist auf den falschen Verteilungs-ARN. Überprüfen Sie die Richtlinie mitaws s3control get-access-point-policyund stellen Sie sicher, dass der Verteilungs-ARN mit dem in Ihreraws cloudfront create-distributionAntwort übereinstimmt.- Der Player lädt die Master-Playlist, kann sie aber nicht abspielen
Vergewissern Sie sich, dass die Segmentdateien
Content-Type: video/mp2tund die Playlisten dies getan habenContent-Type: application/vnd.apple.mpegurl. Manche Player lehnen Segmente mit generischen Inhaltstypen ab. Re-upload mit der richtigen--content-typeFlagge.- Neue Playlisten brauchen Zeit, um Zuschauer zu erreichen
CloudFront speichert Playlisten für die TTL, die in deinem
Cache-ControlHeader festgelegt wurden. Wenn du eine kürzere TTL benötigst, lade die Playlist mit einem kleinerenmax-ageWert 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 AnfrageDas 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 --iddistribution-id\ --query 'ETag' --output text) aws cloudfront get-distribution-config --iddistribution-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 --iddistribution-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 --iddistribution-id\ --query 'Distribution.Status' # Delete the distribution using the ETag from the update call. aws cloudfront delete-distribution --iddistribution-id\ --if-match "$UPDATE_ETAG" # Fetch the OAC ETag, then delete the OAC. OAC_ETAG=$(aws cloudfront get-origin-access-control --idoac-id\ --query 'ETag' --output text) aws cloudfront delete-origin-access-control --idoac-id\ --if-match "$OAC_ETAG" aws s3control delete-access-point-policy \ --account-idaccount-id--nameaccess-point-nameaws s3 rm "s3://access-point-alias/content/sintel/" --recursive