Günümüzün dijital ortamında, çeşitli cihazlar ve ağ koşulları üzerinden yüksek kaliteli video içeriği sunmak her zamankinden daha önemlidir. İster bir akış platformu, ister çevrimiçi bir öğrenme portalı, ister bir sosyal medya uygulaması veya video oynatma gerektiren herhangi bir uygulama geliştiriyor olun, kusursuz video akışı optimum bir kullanıcı deneyimi için olmazsa olmazdır.
Bulut tabanlı bir kodlama hizmeti kullanarak video dönüşümünü otomatikleştirmek, altyapı karmaşıklıklarını azaltırken kullanıcılarınız için en iyi video kalitesini garanti ederek, uyarlanabilir akışları zahmetsizce oluşturmanıza olanak tanır. Bu çözümü uygulamanızın taleplerini karşılamak için nasıl uygulayabileceğinizi inceleyelim. Amacımız, dağıtımı kolay, bakım gerektirmeyen ve büyüyen bir kullanıcı tabanını destekleyen bir çözüm oluşturmaktır.
En popüler video akışı protokollerinden biri olan HLS'ye (HTTP Canlı Yayın) odaklanacağız. HLS kodlama ve segmentasyon kullanır: orijinal video farklı bit hızları ve çözünürlüklerle birden fazla versiyona kodlanır. Bu kodlanmış versiyonlar daha sonra genellikle 2 ila 10 saniye uzunluğunda küçük parçalara bölünür ve her parça ayrı bir dosya olarak saklanır. Daha sonra oynatma listeleri oluşturulur: önce, videonun her kodlanmış versiyonu için ayrı parçaların URL'lerini içeren bir oynatma listesi oluşturulur.
Sonra, akışın farklı sürümlerine (ve bunlara karşılık gelen çalma listelerine) ve çözünürlüklerine ve bit hızlarına atıfta bulunan tek bir ana çalma listesi oluşturulur. Bu kurulum, istemci uygulamalarının istemcinin cihaz çözünürlüğü, görüntüleme alanı boyutu ve ağ koşulları gibi faktörlere göre en uygun akışı seçmesine olanak tanır ve yalnızca gerekli segmentlerin indirilmesini sağlar.
Videolardan HLS akışları oluşturmak için birçok araç mevcuttur. Bunlara FFmpeg'i doğrudan çalıştırmak veya dönüşümü yönetmek ve altyapı yönetiminden kaçınmak için bulut tabanlı hizmetleri kullanmak dahildir. Bu tür hizmetlere örnek olarak AWS Elemental MediaConvert, Google Cloud Transcoder, Bitmovin ve diğerleri verilebilir. Bu gönderide MediaConvert'e odaklanacağız. Aşağıda yüklenen videoları otomatik olarak HLS'ye dönüştürmek ve akışları kullanıcılar için kullanılabilir hale getirmek için olası bir iş akışı verilmiştir. İş akışında ilerlerken lütfen her adımın etiketlendiği ekteki şemaya bakın.
Bir kullanıcı, mobil veya web istemci uygulamasını kullanarak bir videoyu S3 kovasına yükler.
Bir Lambda işlevi, Video Uploads S3 kovasındaki ObjectCreate olayı tarafından tetiklenir. Bu işlev, sağlanan yapılandırmayı kullanarak bir MediaConvert işi oluşturur ve sonra çıkar (video dönüştürmenin tamamlanmasını beklemez). MediaConvert API'si, kodek seçimi, bit hızı, kalite, ses işleme ve daha fazlası dahil olmak üzere çeşitli ayarlar sunar. Ayrıca, 360p, 720p, 1080p vb. gibi farklı sıkıştırma ayarlarıyla akışın birden fazla sürümünü oluşturabilir.
Kodlama yapılandırmasını seçmek bu gönderinin kapsamı dışında olsa da, kod örneği 1 Mbps bit hızında tek bir işleme sahip temel bir HLS paketleme işi içerir. Yapılandırma, her uygulamanın gereksinimlerini karşılamak için kolayca genişletilebilir. IAM izinlerine gelince, bu işlevin kaynak S3 kovasına okuma erişimi, hedef S3 kovasına yazma erişimi ve MediaConvert API'sine erişime ihtiyacı vardır.
import boto3 import re output_bucket_name = 'converted-videos-bucket' mediaconvert_role_arn = 'arn:aws:iam::123456789012:role/MediaConvertRole' # output bucket access s3_client = boto3.client('s3') mediaconvert_client = boto3.client('mediaconvert') hls_main_playlist_suffix = '-hls.m3u8' # regex used to normalize the object key for the client request token client_request_token_symbols_to_skip = r'[^a-zA-Z0-9-_]' def lambda_handler(event, context): # get S3 bucket name and object key from the event bucket_name = event['Records'][0]['s3']['bucket']['name'] object_key = event['Records'][0]['s3']['object']['key'] # also used as media id # normalize the object key for the client request token client_request_token_obj_key = re.sub(client_request_token_symbols_to_skip, '_', object_key) # call MediaConvert to transcode the video create_job_response = mediaconvert_client.create_job( Role=mediaconvert_role_arn, ClientRequestToken=client_request_token_obj_key, Settings={ 'Inputs': [ { 'FileInput': f's3://{bucket_name}/{object_key}', 'AudioSelectors': { 'Audio Selector 1': { 'DefaultSelection': 'DEFAULT', }, }, } ], 'OutputGroups': [ { 'Name': 'DefaultOutputGroup', 'OutputGroupSettings': { 'Type': 'HLS_GROUP_SETTINGS', 'HlsGroupSettings': { 'Destination': f's3://{output_bucket_name}/{object_key}-hls', 'DirectoryStructure': 'SUBDIRECTORY_PER_STREAM', 'SegmentLength': 5, 'MinSegmentLength': 2, 'SegmentsPerSubdirectory': 500, 'ProgressiveWriteHlsManifest': 'DISABLED', }, }, 'Outputs': [ { 'NameModifier': '-h264', 'ContainerSettings': { 'Container': 'M3U8', }, 'VideoDescription': { 'CodecSettings': { 'Codec': 'H_264', 'H264Settings': { 'RateControlMode': 'VBR', 'Bitrate': 1000000, }, }, }, 'AudioDescriptions': [ { 'AudioSourceName': 'Audio Selector 1', 'CodecSettings': { 'Codec': 'AAC', 'AacSettings': { 'Bitrate': 96000, 'CodingMode': 'CODING_MODE_2_0', 'SampleRate': 48000, }, }, }, ], }, ], } ], }, ) print('Created a MediaConvert job:', create_job_response) return { 'statusCode': 200, 'body': 'OK', }
MediaConvert videoyu işler ve çıkış S3 kovasında HLS çalma listeleri ve video segmentleri oluşturur. Çıkış kovası, çalma listelerini ve video segmentlerini önbelleğe alan bir CDN'ye bağlıdır. Bu örnekte Cloudfront kullanıyoruz ancak S3 ile uyumlu herhangi bir CDN kullanılabilir.
Başka bir Lambda işlevi, çıktı kovasındaki ObjectCreate olayı tarafından tetiklenir. İşlevin yalnızca bir çalma listesi dosyası oluşturulduğunda çalışmasını sağlamak için bu tetikleyiciye bir nesne adı filtresi eklenir (segment dosyaları yok sayılır).
Bu fonksiyon, çalma listesi URL'sini veritabanındaki medya kaydına ekler. Depolama katmanı bu gönderinin kapsamı dışındadır, bu nedenle kod örneğinde URL basitçe yazdırılır.
import boto3 s3_client = boto3.client('s3') def lambda_handler(event, context): # this function is triggered only when a playlist file # with object key that looks like this '<video_id>-hls.m3u8' # is created in the S3 bucket # get object key from the event object_key = event['Records'][0]['s3']['object']['key'] # extract video id from the object key video_id = object_key.replace('-hls.m3u8', '') print(f'HLS playlist {object_key} created for video {video_id}') # TODO: update the video record in the database return { 'statusCode': 200, 'body': 'OK', }
Kullanıcılar istemci uygulamasının kullanıcı arayüzünde videoyu açtığında, istemci uygulaması API'yi kullanarak medya kaydını veritabanından alır. Bu medya kaydı ana oynatma listesi URL'sini içerir.
Video oynatıcısı ana oynatma listesini CDN'den alır ve görüntüleme alanı boyutu, ekran çözünürlüğü, ağ koşulları vb. gibi faktörlere bağlı olarak hangi akışın oynatılacağına karar verir. Daha sonra akış oynatma listesini ve video bölümlerini CDN'den alır ve videoyu oynatmaya başlar.
Bu çözümün dağıtımı çok kolaydır ve bakım gerektirmez. Birçok kullanıcı için ölçeklenebilirlik açısından, MediaConvert işlerinin varsayılan olarak 100-200 videoyu eş zamanlı olarak işleyebilen tek bir kuyruğa eklendiğini (bölgeye bağlı olarak) belirtmek önemlidir. Ek kuyruklar oluşturulabilir (bölge başına 10'a kadar) ve kuyruklara eklendiklerinde işlere öncelikler atanabilir. Ayrıca AWS'den kota artışı talep etme seçeneği de vardır.
Sonuç olarak, AWS Elemental MediaConvert gibi bulut tabanlı hizmetleri kullanarak video dönüşümünü otomatikleştirmek, karmaşık altyapıyı yönetme yükü olmadan cihazlar arasında yüksek kaliteli akış içeriği sunmanın etkili bir yoludur. Bu yaklaşım yalnızca video kodlama sürecini basitleştirmekle kalmaz, aynı zamanda ölçeklenebilirliği de artırarak platformunuzun artan talebi karşılayabilmesini sağlar.
S3, Lambda fonksiyonları ve CloudFront gibi araçları MediaConvert ile birlikte kullanarak, uyarlanabilir HLS akışlarını verimli bir şekilde oluşturabilir ve sunabilir, kullanıcılara optimize edilmiş bir görüntüleme deneyimi sağlayabilirsiniz.