Wowza ve Amazon Elastic Transcoder ile Çevrimiçi Video

Yayınlanan: 2022-03-11

Günümüzde herhangi bir web uygulamasının başarısı ve benimsenmesi, performansına, esnekliğine ve kullanım kolaylığına büyük ölçüde bağlıdır.

Özellikle günümüzün DEHB dünyasında, sayfa yüklenmesi çok uzun sürerse, kullanıcılar bir uygulamaya karşı sabrını çabucak kaybedecektir. Doğal olarak bilgi işlem ve G/Ç açısından yoğun olan video işlemeyi desteklemesi gereken web uygulamaları için bu zorluk özellikle akuttur. Kullanıcılar, akıllı telefon veya tablette çalışıyor olsalar bile videolarının yüksek kalitede olmasını ve hızlı yüklenmesini isteyen, yine de giderek daha talepkar hale geliyor.

Kullanıcılar, tercih ettikleri tarayıcıda veya cihazda çalışmayan ya da yüklemeleri veya dışa aktarmaları gereken veri biçimini desteklemeyen web uygulamalarına karşı toleranslarını da kaybediyorlar. Bu nedenle desteklenmesi gereken video formatlarının çeşitliliği, video desteğini bir web uygulamasına dahil etmeyi özellikle zorlaştırıyor.

Bu gönderi, video özelliklerini PHP tabanlı bir web uygulamasına dahil etmek için açık kaynak teknolojilerinden ve bulut tabanlı hizmetlerden nasıl etkili bir şekilde yararlandığımı açıklıyor.

Wowza ve Amazon Elastic Transcoder ile PHP'de Çevrimiçi Video İşleme

Kullanım Örneği

Kayıtlı kullanıcıların videolarını yükleyip paylaşabilecekleri, YouTube benzeri bir web sitesi geliştirmesi gereken bir ekibin parçasıydım.

Sistemin, kayıtlı kullanıcıların videolarını daha sonra ortak bir formata (MP4) dönüştürülecek olan desteklenen çeşitli formatlarda yüklemelerine izin vermesi gerekiyordu. Ayrıca bir video ilerleme çubuğunda kareleri göstermek için video oynatıcıda kullanılacak bir dizi küçük resim ve bir resim kolajı oluşturmamız gerekiyordu.

Müşteri gereksinimleri, mevcut herhangi bir CDN veya kod dönüştürme API'sini kullanmamızı engellediği için işler daha da karmaşıklaştı, bu nedenle çözümümüzü sıfırdan geliştirmemiz gerekiyordu.

Video Yükleme

Yükleme işleminin kendisinin videoya özel olması gerekmediğinden (sadece kullanımı kolay bir dosya yükleme özelliğine ihtiyacımız vardı), kendi çözümümüzü kullanmak yerine mevcut bir açık kaynak çözümünü kullanmak mantıklıydı. jQuery-File-Upload'ı seçtik, çünkü bizim durumumuzda gerekli olan iki özelliği destekliyordu; yani, bir yükleme ilerleme çubuğu ve parçalı yüklemeler.

Toplu yükleme, bir kullanıcının hemen hemen her boyutta bir video dosyası yüklemesine izin vermemizi sağladı (özellikle HD çözünürlükte video dosyalarını desteklemek için önemlidir). Bu yaklaşımla, dosya ön uçta her bir veri öbeğiyle (her bir öbek için öbek numarası ve toplam dosya boyutu gibi meta verilerle birlikte) yükleme eylemini başlatan birden çok "parçaya" bölünür. Tam video dosyası daha sonra arka uçta yeniden birleştirilir. Bu arada, bazı tarayıcıların (Mobile Safari gibi) parçaları rastgele sırayla iletme eğilimi olduğundan, meta verilere yığın numarasının dahil edilmesi özellikle önemliydi.

Çevrimiçi Video İşleme

Video işleme, durağan görüntüler kadar kareleri yakalamak kadar basit olabilir veya görüntü iyileştirme, video akışını dengeleme vb. gibi daha karmaşık işlemleri içerebilir. Bizim durumumuzda, yalnızca video işleme gereksinimleri (a) video kodeklerini ve diğer önemli meta verileri çıkarmak ve (b) bir dizi küçük resim ve bir görüntü kolajı oluşturmaktı (video oynatıcıda kareleri video ilerlemesinde göstermek için kullanılacaktı). Çubuk).

FFmpeg – yaygın olarak kullanılan, özgürce dağıtılan, açık kaynaklı bir kitaplık – bu gereksinimleri karşılamada son derece yardımcı oldu. FFmpeg, ses ve video dosyalarını kaydetmek, dönüştürmek ve yayınlamak için eksiksiz, platformlar arası bir çözüm sunar. Ayrıca videoları dönüştürmek ve basit düzenleme yapmak için de kullanılabilir (örneğin, kırpma, kesme, filigran ekleme vb.).

Amaçlarımız doğrultusunda, videoyu on bölüme ayırmak için FFmpeg kullanabildik ve ardından gerekli işlevselliği sağlamak için her bölüm için bir küçük resim yakalayabildik.

Ne yazık ki, FFmpeg kitaplığı için PHP dili bağlaması yoktur. Sonuç olarak, PHP'den FFmpeg'den yararlanmanın tek yolu sistem komutlarını kullanarak ikili dosyayı komut satırından çağırmaktır. PHP'de FFmpeg kullanmanın temel olarak iki yolu vardır:

  • libav. Libav, multimedya verilerini işlemek için kütüphaneler ve programlar üreten, 2011 yılında FFmpeg'den çatallanan ücretsiz bir yazılım projesidir. Örneğin Ubuntu'da bu, sudo apt-get install libav-tools . libav komutları FFmpeg ve avconv ile uyumludur. PHP'nin bunu programlı olarak kullanabilmesi için ffmpeg/avconv komut satırı erişimi olması gerekir.
  • PHP-FFMpeg. PHP-FFMpeg, FFMpeg ikili dosyası için nesne yönelimli bir PHP sürücüsüdür. Basitçe composer update "php-ffmpeg/php-ffmpeg" çalıştırarak erişilebilir.

İlgilendiğimiz FFmpeg işlevine kolay erişim sağladığı için PHP-FFMpeg kullandık. Örneğin, bu paketteki FFProbe sınıfı, kodekler veya belirli bir video dosyasının uzunluğu hakkında aşağıdaki gibi bilgi almanızı sağlar:

 $ffprobe = FFMpeg\FFProbe::create(); $ffprobe ->format('/path/to/video/mp4') // extracts file informations ->get('duration');

FFmpeg ayrıca herhangi bir video karesini kaydetmeyi de kolaylaştırır:

 $ffmpeg = FFMpeg\FFMpeg::create(); $video = $ffmpeg->open('video.mpg'); $video ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10)) ->save('frame.jpg');

Daha ayrıntılı örnek kod burada mevcuttur.

Bir uyarı notu: Bazı patent yasaları nedeniyle, tüm codec bileşenleri FFmpeg tarafından işlenemez ve bazı formatlar düzgün (veya tam olarak) desteklenmez. Birkaç yıl önce, örneğin, özellikli telefonlar için desteğin şart olduğu .3gp formatı ile mücadele ettiğimi hatırlıyorum.

Kuyruk

Bir videonun codec bileşenlerini ve diğer meta verilerini aldıktan sonra, videoyu bir FIFO (ilk giren ilk çıkar) dönüştürme kuyruğuna göndeririz. Sıra, her çalıştırıldığında belirli sayıda işlenmemiş videoyu seçen ve bunları bir dönüştürme yardımcı programına ileten basit bir cron komut dosyası kullanılarak uygulandı (örnek kaynak kodu burada mevcuttur).

Dönüştürme yardımcı programı, dönüştürmeyi gerçekleştirmek için FFMpeg'i çağırır ve her videoyu işlenmiş olarak işaretler.

Ayrıca 1 dakikalık videoyu dönüştürmek için ortalama süreyi hesaplayan basit bir bekleme süresi tahmin mekanizması geliştirdik. Bu ortalamayı kullanarak, bir videonun yüklenmesi tamamlandıktan sonra işlenecek videonun kaç dakikası kaldığına bağlı olarak tahmini kalan işlem süresini hesaplayabilir ve kullanıcıya görüntüleyebiliriz.

Video Formatı Dönüşümü

Temelde tüm cihazlar ve görüntü işleme yazılımları tarafından desteklenen hareketsiz görüntüler için evrensel olarak tanınan belirli biçimler (JPEG ve GIF gibi) ortaya çıkmıştır. Bazı video formatları diğerlerinden daha yaygın olsa da, videolar için henüz evrensel olarak desteklenen böyle bir format ortaya çıkmadı.

Bizim durumumuzda, çeşitli formatlardan tek bir ortak formata (MPEG-4) dönüştürme ihtiyacına ek olarak, dönüştürülen videoların mobil cihazlara akış için optimize edilmesi gerekiyordu.

Video formatı dönüştürme için (en azından kısa vadeli ihtiyaçlarımız için), bulut tabanlı Amazon Elastic Transcoder'ı kullanmak mevcut en iyi seçenekti. Genel kullanım kolaylığına ek olarak, kod dönüştürücü hizmeti, optimizasyon ve tüm kodlama ayarlarıyla ilgilenir. Neyse ki, hizmeti PHP kodumuzdan çağırmayı kolaylaştıran PHP için bir AWS SDK mevcuttur.

Not: Hızlı bir şekilde çalışmaya başlamak istiyorsanız, Amazon Elastic Transcoder gibi bulut tabanlı bir hizmet kullanmak harikadır. Ancak, bu seçeneğin müşteriniz için, özellikle de iş modelinin büyük videoların kapsamlı kullanımını gerektirme olasılığı varsa, pahalı olabileceğini unutmayın. Göz önünde bulundurulması gereken diğer bir faktör de, müşterinizin videolarının veya iş modelinin Hizmet Şartları ile uyumlu olacağını varsaymamanız gerektiğidir.

Amazon, neredeyse anında ölçek büyütme ve küçültme yeteneği sağlamak için, Otomatik Ölçeklendirme ve SNS (Basit Bildirim Hizmeti) ile birlikte temel depolama ve bilgi işlem öğeleri olan S3 (Basit Depolama Hizmeti) ve EC2'yi (Elastic Compute Cloud) kullanır.

Amazon, paketin Composer tarafından kurulabilir bir sürümüne sahip olduğundan, aws-sdk'nin kurulumu basittir. composer.json dosyanıza ”aws/aws-sdk-php": "2.*" ekleyin ve bir composer update yapın.

Açıkçası, Amazon Elastic Transcoder'a erişmek için bir Amazon hesabı gerekir, bu nedenle sizin (veya müşterinizin) zaten bir hesabı yoksa bunu da ayarlamanız gerekir.

Amazon Elastic Transcoder hizmetini kullanmamız, önce video dosyalarının S3'teki uygun bir klasöre yüklenmesini gerektirdi. Daha sonra kod dönüştürücü işini, tamamlandığında belirtilen adrese bir HTTP isteği gönderen bir küçük resmin kodunun çözülmesinden ve oluşturulmasından sorumlu hale getirdik. Bu, AWS panelinde bazı yapılandırmalar gerektirir, ancak oldukça basittir ve Amazon bunun nasıl yapılacağına dair iyi belgeler sağlar.

Symfony 2 entegrasyonunu basitleştirmeye yardımcı olan kod dönüştürücü paketimizi kullanmaktan çekinmeyin. Bir kullanım açıklaması içerir ve işlenen video hakkında bilgi toplamak için Amazon tarafından gönderilen bir bildirim hizmetinin hızlı uygulanması için bir denetleyici sunar. Bir kullanım örneği burada mevcuttur.

Buna ek olarak, Amazon bildirimlerini işleyen örnek bir denetleyici burada mevcuttur ve ayrıca bir abonelik adresinin onayını da uygular. Hizmet, bunun geçerli bir bildirim alıcısı olduğunu doğrulamak için önce ziyaret edilecek URL'yi gönderir. O zaman gerçekten gerekli olan tek şey videoyu işlenmiş olarak işaretlemek. O andan itibaren, bulutta depolanan kodu dönüştürülmüş videoyu kullanabiliriz.

Yayın Akışı

Video akışı, yüksek performans gerektiren bir yetenektir: Kesintisiz akış için kullanıcı beklentileri yüksektir ve gecikme toleransı son derece düşüktür. Bu zorluk, gerçek zamanlı olarak aynı anda birden fazla istemciye video akışı yapma ihtiyacı nedeniyle genellikle daha da kötüleşir.

Bizim durumumuzda, her kullanıcının kendi video kanalını oluşturmasını ve yayına başlamasını desteklememiz gerekiyordu. Çözümümüz üç bileşenden oluşuyordu:

  • Gösterge Paneli. Bir yayıncının panosu olarak hizmet veren ve video sunma yeteneği sağlayan uygulama.
  • izleyici. Bir video akışını tüketen ve görüntüleyen video istemcisi.
  • Akış Motoru. Bulut tabanlı video akışı hizmeti.

Talep Üzerine Video (VOD) teknolojisinin hala gelişmekte olmasına ek olarak, karşılaştığımız bir diğer sorun da kamera erişiminin iyi desteklenmemesi ve yalnızca bir P2P bağlantısı sunmasıydı. Ayrıca amacımız, aynı anda birden fazla kullanıcı için çevrimiçi yayın sağlamaktı. Ayrıca, getUserMedia/Stream API desteği (önceden <device> öğesi olarak tasavvur ediliyordu) modern tarayıcılarda henüz tutarlı değil. Bu faktörlere dayanarak, gerçekten tek makul seçim olduğu için Flash teknolojisini kullanmaya karar verdim. Bu nedenle her iki uygulama da (Dashboard ve Viewer) Flex ve ActionScript kullanılarak uygulandı.

Akış motoru için Wowza kullandık. Ticari olmayan başka çözümler olsa da (aslında Wowza'nın yerini alacak şekilde pazarlanan Red5 gibi), bizim durumumuzda ticari ürün desteği önemli bir faktördü. Ayrıca, en azından biz sistemi kurarken, Wowza ek bir avantaj olan daha iyi belgeler sundu. (Wowza'nın deneme sürümünü 30 gün boyunca ücretsiz olarak alabileceğinizi ve ayrıca 180 güne kadar kullanabileceğiniz geliştiricinin deneme sürümü olduğunu unutmayın. Ancak bazı sınırlamalar vardır; akış yalnızca iki istemci için çalışabilir ve sınır vardır. maksimum bağlantı sayısında.)

Wowza Akış Motoru

Wowza ile sağlanan LiveStream uygulamasını kullandık. Yapılandırmak için applications/app_name boş bırakın ve conf/app_name içinde Application.xml dosyasını conf kataloğundan kopyalayın. <Streams> bölümünü aşağıdaki gibi yapılandırmak için dosyayı düzenleyin:

 <Streams> <StreamType>live</StreamType> <StorageDir>${com.wowza.wms.context.VHostConfigHome}/content</StorageDir> <KeyDir>${com.wowza.wms.context.VHostConfigHome}/keys</KeyDir> <LiveStreamPacketizers></LiveStreamPacketizers> <Properties></Properties> </Streams>

Anahtar parametre <StreamType>live</StreamType> olup, bunun canlı bir video beslemesinden (örneğin bir kamera) gelen bir akış olacağını tanımlar. Bu dosyayı düzenledikten ve kaydettikten sonra Wowza'yı yeniden başlatmanız gerekeceğini unutmayın.

Flash (Flex/ActionScript) Uygulamaları

Flash, bir kamera ve mikrofonu Wowza akış sunucusuna bağlamak için tam entegre bir sistem sağlar. Bu, ActionScript deneyiminiz sınırlıysa özellikle yararlıdır.

Uygulamanın tamamı esas olarak aşağıdaki nesneler arasındaki etkileşime dayanmaktadır:

  • NetConnection. NetConnection sınıfı, bir istemci ve bir sunucu arasında iki yönlü bir bağlantı oluşturur. İstemci, bir Flash Player veya AIR uygulaması olabilir. Sunucu bir web sunucusu, Flash Media Server, Flash Remoting çalıştıran bir uygulama sunucusu veya Adobe Stratus hizmeti olabilir.
  • Kamera. Camera sınıfı, istemci sistemden veya cihaz kamerasından video çekmek için kullanılır.
  • Mikrofon. Mikrofon sınıfı, bir mikrofondan ses izlemek veya yakalamak için kullanılır.
  • NetStream. NetStream sınıfı, bir NetConnection üzerinden tek yönlü bir akış kanalı açar.

İlk olarak, NetConnection örneğini kullanarak Wowza akış sunucusuna bağlanıyoruz ve ardından ağ bağlantısı durumundaki değişiklikleri dinleyecek olay dinleyicisini ekliyoruz:

 nc = new NetConnection(); nc.connect(serverAddress:string); nc.addEventListener( NetStatusEvent.NET_STATUS, // event type eNetStatus, // listener function false, // use capture? 0, // priority true // use weak reference? );

İşte kamera ve mikrofonu akış sunucusuna bağlayan bir olay dinleyicisinin minimalist bir örneği:

 private function eNetStatus(e:NetStatusEvent):void { switch (e.info.code) { case "NetConnection.Connect.Success": camera = Camera.getCamera(); mic = Microphone.getMicrophone(); ns = new NetStream(nc); ns.publish(streamName, "live"); ns.attachCamera(camera); ns.attachAudio(mic); break; case "NetConnection.Connect.Closed": // debug trace... display user message break; }

İstemci kodu, yalnızca kullanıcı tarafında video girişini göstermemiz dışında çok benzer. Bu, aşağıdaki basit örnekte gösterildiği gibi akışı Video nesnesine bağlayarak yapılır:

 if(event.info.code == "NetConnection.Connect.Success") { ns = new NetStream(nc); ns.client = nsClient; ns.addEventListener(NetStatusEvent.NET_STATUS, nsClient.onNetStatus); ns.play(streamName); video = new Video(); addChild(video); // this will display video video.attachNetStream(ns); // connect NetStream to video }

Sarmak

Canlı akış ve videonun mobil ve web uygulamalarında giderek daha önemli bir rol oynaması beklenebilir. Bu nedenle, web geliştiricilerinin video kod dönüştürme, işleme ve akışa aşina olmaları önemlidir. Bu yetenekleri web uygulamalarına dahil etmek için günümüzde çok sayıda araç, kitaplık ve hizmet bulunmaktadır. Bu makale, YouTube benzeri basit bir siteyi nispeten kolay bir şekilde başarılı bir şekilde oluşturmak için bu teknolojilerin bir kısmından nasıl yararlandığımızı ve entegre ettiğimizi göstermektedir.