Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Streaming video menggunakan CloudFront
Alur kerja media biasanya menyimpan konten jadi — file video on demand (VOD), paket HTTP Live Streaming (HLS), gambar, dan grafik — pada FSx untuk volume ONTAP yang ditulis oleh editor, produsen, dan sistem otomasi menggunakan NFS atau SMB.
Dengan jalur akses Amazon S3 yang terpasang pada FSx untuk volume ONTAP, CloudFront dapat menyajikan konten langsung dari volume. Editor dan sistem produksi mempublikasikan ke volume melalui NFS atau SMB seperti yang selalu mereka miliki, CloudFront mengambil konten melalui titik akses, dan pemirsa menerima konten dari lokasi tepi terdekat. CloudFront
Dalam tutorial ini, Anda menyandikan video sampel sebagai paket bitrate adaptif HLS, mengunggah output ke titik akses yang dilampirkan ke FSx untuk volume ONTAP, mengonfigurasi CloudFront distribusi dengan kontrol akses asal sehingga pemirsa tidak dapat mem-bypass CloudFront untuk mencapai volume secara langsung, dan memverifikasi bahwa aliran diputar ujung ke ujung.
catatan
Tutorial ini membutuhkan waktu sekitar 40 hingga 60 menit untuk menyelesaikannya. Yang Layanan AWS digunakan dikenakan biaya untuk sumber daya yang Anda buat. Jika Anda menyelesaikan semua langkah, termasuk bagian Pembersihan segera, biaya yang diharapkan kurang dari $1 di AS Timur (Virginia Utara). Wilayah AWS Perkiraan ini tidak termasuk biaya yang sedang berlangsung untuk FSx untuk volume ONTAP itu sendiri.
Cara kerja polanya
Alur permintaan adalah:
Pemutar pemirsa (browser, aplikasi seluler, TV pintar) meminta daftar putar master HLS dari domain. CloudFront
CloudFront memeriksa cache tepinya. Jika salah, CloudFront tandatangani permintaan menggunakan Signature Version 4 (SigV4) dengan kontrol akses asal (OAC) dan meneruskannya ke titik akhir Amazon S3 untuk titik akses.
Titik akses mengotorisasi permintaan terhadap kebijakan aksesnya, yang memungkinkan prinsipal CloudFront layanan tercakup ke distribusi Anda, dan mengembalikan objek yang diminta dari FSx untuk volume ONTAP.
CloudFront cache respons di tepi dan mengembalikannya ke penampil.
Paket HLS mencampur dua jenis file yang mendapat manfaat dari kebijakan cache yang berbeda:
Daftar putar (
.m3u8) menjelaskan segmen mana yang membentuk aliran. GunakanCache-ControlTTL pendek sehingga Anda dapat mempublikasikan daftar putar yang diperbarui dengan cepat.Segmen (
.ts) berisi video dan audio yang dikodekan. Setelah ditulis, konten segmen tidak pernah berubah, jadi gunakan TTL yang panjang dan tidak dapat diubahCache-Control.
Prasyarat
FSx untuk volume ONTAP dengan titik akses Amazon S3 terpasang. Jalur akses harus memiliki asal jaringan internet sehingga CloudFront dapat mencapainya. Untuk petunjuk, lihat Membuat titik akses.
AWS CLI versi 2 diinstal dan dikonfigurasi dengan kredensyal yang dapat membuat CloudFront distribusi, kontrol akses asal, dan kebijakan titik akses.
FFmpeg
dipasang secara lokal, untuk menyandikan video sampel ke HLS. File video sumber. Tutorial ini menggunakan trailer Sintel
dari Blender Foundation, klip 1080p 52 detik yang dirilis di bawah Creative Commons.
Langkah 1: Encode video sumber sebagai paket HLS
Gunakan FFmpeg untuk menghasilkan paket HLS tiga varian pada 360p, 720p, dan 1080p dengan bitrate over-the-top (OTT) realistis. Paket yang dihasilkan mencakup daftar putar utama yang mereferensikan daftar putar per varian, yang masing-masing mencantumkan segmen aliran transport empat detik.
-
Unduh video sumber.
$mkdir -p ~/media && cd ~/media curl -sSL -o sintel-1080p.mp4 \ https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4 -
Encode video ke HLS dengan tiga varian adaptive-bitrate.
$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"Perintah menghasilkan pohon direktori dengan satu daftar putar master, tiga daftar putar varian, dan segmen aliran transportasi untuk setiap varian.
hls/ ├── master.m3u8 ├── stream_360p/ │ ├── playlist.m3u8 │ ├── seg_000.ts │ └── ... ├── stream_720p/ │ ├── playlist.m3u8 │ ├── seg_000.ts │ └── ... └── stream_1080p/ ├── playlist.m3u8 ├── seg_000.ts └── ...
Langkah 2: Unggah paket HLS ke titik akses
Unggah paket dua kali — sekali untuk daftar putar dengan TTL pendek, dan sekali untuk segmen dengan TTL yang panjang dan tidak dapat diubah. Menetapkan yang benar Content-Type adalah penting: sebagian besar pemain membutuhkan application/vnd.apple.mpegurl untuk .m3u8 dan video/mp2t untuk.ts.
Ganti access-point-alias dengan alias titik akses Anda.
$# 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"
Verifikasi bahwa kedua file diunggah dengan jenis konten yang diharapkan dan header cache.
$aws s3api head-object --bucketaccess-point-alias\ --key content/sintel/master.m3u8 \ --query '{ContentType:ContentType,CacheControl:CacheControl}'
Langkah 3: Buat kontrol akses asal
Kontrol akses asal (OAC) memungkinkan CloudFront menandatangani permintaan ke titik akses Anda sehingga hanya CloudFront dapat mengambil objek. Tanpa OAC, pemirsa dapat mem-bypass CloudFront dengan meminta objek langsung dari titik akhir titik akses.
$aws cloudfront create-origin-access-control \ --origin-access-control-config \ 'Name=fsxn-media-oac,SigningProtocol=sigv4,SigningBehavior=always,OriginAccessControlOriginType=s3'
Catat Id dalam respons. Anda menggunakannya di langkah berikutnya.
Langkah 4: Buat CloudFront distribusi
Buat CloudFront distribusi dengan alias access point sebagai domain asal. Gunakan kebijakan cache CachingOptimized terkelola, yang menghormati Cache-Control header yang Anda tetapkan di Langkah 2.
-
Simpan konfigurasi berikut ke file bernama
dist.json, ganti placeholder.{ "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} }catatan
PriceClass_100menggunakan lokasi CloudFront tepi hanya di Amerika Utara dan Eropa, yang membuat biaya lebih rendah untuk tutorial ini. Untuk cakupan tepi global, ubah nilainya menjadiPriceClass_All. Untuk informasi selengkapnya, lihat Memilih kelas harga untuk CloudFront distribusi. -
Buat distribusi.
$aws cloudfront create-distribution --distribution-config file://dist.json \ --query 'Distribution.{Id:Id,DomainName:DomainName,ARN:ARN}'Perhatikan ID distribusi, ARN, dan nama domain dalam respons. Distribusi membutuhkan waktu sekitar lima menit untuk digunakan. Anda dapat melanjutkan ke Langkah 5 saat menyebarkan.
Langkah 5: Lampirkan kebijakan jalur akses yang memungkinkan CloudFront
Kebijakan jalur akses memberikan izin kepada prinsipal CloudFront layanan untuk membaca objek, yang mencakup distribusi spesifik Anda menggunakan kondisi tersebut. AWS:SourceArn
-
Simpan kebijakan berikut ke file bernama
ap-policy.json, menggantikan placeholder.{ "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" } } }] } -
Lampirkan kebijakan ke titik akses.
$aws s3control put-access-point-policy \ --account-idaccount-id\ --nameaccess-point-name\ --policy file://ap-policy.json
Langkah 6: Verifikasi pemutaran
Tunggu distribusi mencapai Deployed status.
$aws cloudfront get-distribution --iddistribution-id\ --query 'Distribution.Status'
Ambil daftar putar master melalui. CloudFront
$curl -sS "https://distribution-domain/content/sintel/master.m3u8"
Tanggapan harus mencantumkan tiga varian.
#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
Periksa header respons untuk jenis konten yang benar, kontrol cache, dan status cache.
$curl -sSI "https://distribution-domain/content/sintel/stream_1080p/seg_000.ts"
Respons yang berhasil menunjukkan content-type: video/mp2tcache-control: max-age=31536000,immutable,, dan x-cache header yang menunjukkan apakah respons berasal dari tepi atau asal.
Terakhir, putar aliran ujung ke ujung dengan FFmpeg untuk mengonfirmasi pengambilan dan dekode semua segmen dengan benar.
$ffprobe -v error \ -show_entries stream=codec_name,width,height \ -show_entries format=duration \ "https://distribution-domain/content/sintel/master.m3u8"
Memperluas pola
Gunakan domain khusus dengan HTTPS. Minta sertifikat ACM untuk domain Anda, lampirkan ke distribusi, dan tambahkan catatan CNAME yang mengarah ke domain. CloudFront Untuk petunjuk, lihat Menggunakan URL kustom dengan CloudFront.
Lindungi konten premium dengan URL yang ditandatangani atau cookie yang ditandatangani. Untuk konten yang memerlukan otorisasi (layanan berlangganan, pratinjau akses awal, konten berpagar geografis), gunakan URL yang ditandatangani atau cookie yang ditandatangani. CloudFront Lihat Menyajikan konten pribadi dengan URL yang ditandatangani dan cookie yang ditandatangani.
Membatalkan cache saat Anda mempublikasikan konten baru. Saat Anda mengganti daftar putar atau mengunggah paket HLS baru, gunakan
aws cloudfront create-invalidationuntuk menghapus versi lama dari CloudFront tepi. Untuk segmen yang tidak dapat diubah dengan TTL panjang, pembatalan biasanya tidak diperlukan karena nama file segmen unik per paket.Aktifkan CORS untuk pemain berbasis browser. Jika pemutar HLS berbasis browser di domain lain memuat aliran Anda, tambahkan
Access-Control-Allow-Originheader ke respons menggunakan kebijakan header respons. CloudFrontPermintaan penampil log. Aktifkan pencatatan CloudFront standar atau log waktu nyata untuk menangkap permintaan penampil untuk analisis, penagihan, atau deteksi penyalahgunaan.
Pemecahan masalah
- 403 Dilarang dari CloudFront
Kebijakan jalur akses tidak ada, tidak termasuk prinsipal CloudFront layanan, atau
AWS:SourceArnkondisi referensi ARN distribusi yang salah. Verifikasi kebijakan denganaws s3control get-access-point-policydan konfirmasikan distribusi ARN cocok dengan yang ada di tanggapan Andaaws cloudfront create-distribution.- Pemain memuat daftar putar utama tetapi gagal bermain
Periksa apakah file segmen memiliki
Content-Type: video/mp2tdan daftar putar.Content-Type: application/vnd.apple.mpegurlBeberapa pemain menolak segmen dengan jenis konten generik. Re-upload dengan--content-typebendera yang benar.- Daftar putar baru membutuhkan waktu untuk menjangkau pemirsa
CloudFront cache playlist untuk TTL yang ditetapkan oleh header Anda.
Cache-ControlJika Anda membutuhkan TTL yang lebih pendek, unggah ulang daftar putar denganmax-agenilai yang lebih kecil, atau buat pembatalan. Segmen tidak memiliki masalah ini karena kontennya tidak berubah.x-cache: Miss from cloudfrontpada setiap permintaanIni normal saat pertama kali penampil di wilayah meminta file. CloudFront mengambil dari asal pada miss dan cache respons untuk TTL. Permintaan selanjutnya untuk file yang sama dari lokasi tepi itu kembali
Hit from cloudfront.- Akses langsung ke titik akses ditolak
Ini yang diharapkan. OAC memerlukan SigV4-signed permintaan dari CloudFront, dan kebijakan jalur akses membatasi akses ke kepala CloudFront layanan. Pemirsa hanya dapat menjangkau konten melalui domain distribusi.
Bersihkan
Nonaktifkan dan hapus distribusi, lalu hapus sumber daya yang tersisa. Distribusi harus dinonaktifkan sebelum dapat dihapus, yang membutuhkan waktu beberapa menit.
Menonaktifkan membutuhkan dua nilai dariget-distribution-config: ETag for--if-match, dan DistributionConfig objek dalam untuk --distribution-config (respons penuh juga berisi ETag, yang update-distribution tidak menerima).
$# 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