View a markdown version of this page

Streaming video menggunakan CloudFront - fsX untuk ONTAP

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. Gunakan Cache-Control TTL 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.

  1. Unduh video sumber.

    $ mkdir -p ~/media && cd ~/media curl -sSL -o sintel-1080p.mp4 \ https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
  2. 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 --bucket access-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.

  1. Simpan konfigurasi berikut ke file bernamadist.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.

  2. 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

  1. Simpan kebijakan berikut ke file bernamaap-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" } } }] }
  2. Lampirkan kebijakan ke titik akses.

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

Langkah 6: Verifikasi pemutaran

Tunggu distribusi mencapai Deployed status.

$ aws cloudfront get-distribution --id distribution-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"

Anda juga dapat membuka URL daftar putar master di Safari atau VLC, atau menyematkannya di halaman web menggunakan JavaScript pemutar seperti hls.js.

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-invalidation untuk 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-Origin header ke respons menggunakan kebijakan header respons. CloudFront

  • Permintaan 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:SourceArn kondisi referensi ARN distribusi yang salah. Verifikasi kebijakan dengan aws s3control get-access-point-policy dan 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/mp2t dan daftar putar. Content-Type: application/vnd.apple.mpegurl Beberapa pemain menolak segmen dengan jenis konten generik. Re-upload dengan --content-type bendera yang benar.

Daftar putar baru membutuhkan waktu untuk menjangkau pemirsa

CloudFront cache playlist untuk TTL yang ditetapkan oleh header Anda. Cache-Control Jika Anda membutuhkan TTL yang lebih pendek, unggah ulang daftar putar dengan max-age nilai yang lebih kecil, atau buat pembatalan. Segmen tidak memiliki masalah ini karena kontennya tidak berubah.

x-cache: Miss from cloudfrontpada setiap permintaan

Ini 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 kembaliHit 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 --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