Linux sunucusundan canlı video akışı nasıl yapılır?


30

İşte yapmak istediğim şey. Etrafa baktım ama herhangi bir düz cevap bulamadık. Ubuntu / MySQL / Apache kullanarak web sitelerini çalıştıran bir Linux kutum var. Ben de kendi statik IP'm var, yani web barındırma kullanmıyorum. Video beslemesini bir dizüstü bilgisayardaki bir web kamerasından (muhtemelen Windows çalıştıran) bir Linux sunucumdan Linux sunucuma aktarabilmeyi ve web sitelerimden birinin kullanıcılarının bu videonun akışını canlı olarak izleyebilmesini istiyorum. Açıkçası, dizüstü bilgisayarın bir şekilde sunucuyla kimlik doğrulaması yapması gerekecek, ancak canlı videoyu web sitesinde kimin görebileceği konusunda herhangi bir kısıtlama olmamalıdır. Teşekkürler.


Böyle bir çözümün nasıl uygulanacağını mı soruyorsunuz veya kullanıma hazır 3. taraf çözümünü mü arıyorsunuz? eski durumda SO bu soru için yanlış bir yer, aşağı oylamanın sebebi olduğuna inanıyorum

Yanıtlar:


46

Şu anda FireWire ile bağlanmış 3 miniDV kameradan çevrimiçi akış geliştiriyorum.

Hızlı ipucu: vlc + flowplayer / jw player

Öncelikle, çevrimiçi akışta kullanabileceğiniz iki video formatı vardır: FLV ve h264. FLV'nin dönüştürülmesi kolaydır, h264 daha iyi boyut / kalite oranına sahiptir, ancak kod dönüştürme çok daha fazla işlemci gerektirir. Her ikisi de web sayfasında flash playerlar tarafından görüntülenebilir.

İkincisi, akış altyapısı. Dizüstü bilgisayarınızdan gelen bant genişliğiniz sınırlı olduğundan (birkaç Mbps en fazla) sunucunuza akış sağlamanız ve istemcilere yeniden göndermeniz gerekir. Böylece akış, sunucuya 1 kez, ardından da müşterilere N kez oradan akacak. Dizüstü bilgisayarınız için internet bağlantınızı tanımlamamışsınız, bu nedenle senaryo iki bölüme ayrılmıştır:

  1. Dizüstü, genel IP adresi ile bağlanır VEYA dizüstü bilgisayar için NAT portunu bağlayabilirsiniz . Sunucudan dizüstü bilgisayara hoş ve kolay bağlanabildiğiniz için bu senaryo çok daha kolaydır. Büyük dezavantaj, bir yere bağlı olmanız (bir IP adresi).

  2. Dizüstü halka açık adrese bağlı değil . Bu biraz zor, ancak sunucunuza SSH vermenize izin verecek ve yeterli yükleme yapacak herhangi bir ağdan çalışacaktır (1 Mbps gerekir).

Kullanılan senaryoya bakılmaksızın, altyapı bu gibi görünecektir

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

Dizüstü bilgisayardan akış

  1. Web kamerasından video çekin . Yerel olarak bağlı olan web kameralarından hiç akış almadım, ancak V4L ile nasıl yapılacağına dair pek çok örnek var, örneğin: Web Kamerası Kurulumu . İlgilenmeniz gereken tek şey:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    Hangi web kamerasına bağlanmak için VLC komutunun ilk kısmı. Daha fazla ayrıntı için bu NASIL belgesini izleyin. Özellikle "video grubu" bölümüne bakın ve / dev / video ve / dev / audio aygıt yolunu düzeltin. Bunlar dizüstü bilgisayarınızda farklı olabilir.

  2. Videoyu FLV'ye dönüştürün . Kişisel olarak FLV'yi kullanıyorum, çünkü daha az CPU gerektiriyor. Kullandığım transcode string:

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    MPGA ses ile video akışını FLV formatına dönüştürecek (MP3 benim Ubuntu'mda mevcut değil). Samplerate bir şekilde zorunlu, onsuz çalışmayacak. Ancak, 22050 gibi daha küçük olanı seçebilirsiniz. Bu, video akışını 'olduğu gibi' dönüştürür, bu nedenle ölçek 1: 1'dir. Genişlik ve yükseklik parametrelerini, hatta ölçek parametresini ekleyebilirsiniz. VLC belgelerine bakın.

  3. Dizüstü bilgisayardan aktar . Şimdi, sunucunun bağlanacağı yerel akışı oluşturmalısınız:

    :std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}

    Bu VLC akışını 0.0.0.0:8081/stream.flv'ye bağlar. Bütün komut şöyle görünecek:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'

Sunucuda dinleniyor

  1. Sunucudaki akışı yakalayın ve yeniden başlatın . Yine, yakalamak ve akış için VLC kullanıyoruz. Kullanım, bu yazının başından itibaren altyapı senaryosuna dayanmaktadır. Gösterdiğim gibi, dizüstü bilgisayarda VLC bazı bağlantı noktalarında video yayınlıyor. Bu portun sunucudan kabul edilebilir olması gerekir. Genel IP adresinin dizüstü bilgisayarı veya NATed bağlantı noktanız varsa, telnet ile test edebilirsiniz:

    server$ telnet public_ip_address 8081

    "Bağlantı zaman aşımı" dışında herhangi bir şey, dizüstü bilgisayarınızın akışına bağlanabileceğinizi gösterir. Genel IP adresiniz yoksa veya NAT portu yoksa, tam tersi şekilde yapmalısınız. Dizüstü bilgisayarınızdan sunucuya SSH ayarlayabilir ve dizüstü bilgisayar bağlantı noktanızı sunucuya uzaktan iletebilirsiniz. Doğru SSH komutu şöyle olacaktır:

    laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081

    Bu sihirli komut, 8081 numaralı dizüstü bilgisayar bağlantı noktanızı, 8081 numaralı sunucu bağlantı noktasına 'bağlar'. Bu, sunucuyu 8081'e bağladığınızda, SSH tüneli üzerinden sessizce dizüstü bilgisayarınızın 8081 numaralı bağlantı noktasına bağlanacağınız anlamına gelir. Güzel, ha? :) Yani tek yapmamız gereken basit VLC bağlantısı ve akışı:

    server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Ya da halka açık IP adresi veya NATed port varsa:

    server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Dizüstü bilgisayardaki gibi, VLC sunucunuz da 8082 numaralı bağlantı noktasına bağlanır. Neden 8082 değil 8081? 8081 zaten SSH uzaktan kumandası tarafından alındı. Neden ilk örnekte olduğu gibi transcode kısmını kullanmıyoruz? Video zaten doğru biçimde, bu nedenle tek yapmamız gereken onu olduğu gibi oynatmak.

  2. Test etmek . Her iki örnekte de VLC üzerinden akışları görüntüleyerek işlevselliği test edebilirsiniz. Yerel akışınızı test edebilirsiniz:

    laptop$ vlc http://localhost:8081/stream.flv

    Ve sunucunuzun akışını test edebilirsiniz:

    laptop$ vlc http://server_ip_address:8082/stream.flv

    Her iki durumda da, web kamerası girişinizi görmelisiniz.

Web’deki akışı görüntüle

Çoğu durumda çalışacak olan web'deki akışı görüntülemek, flash player üzerinden gerçekleştirilir. Ticari olmayan kullanım için ücretsiz olan iki ürünü denedim: JW Player ve Flowplayer . Flowplayer'da kaldım, ancak nedenini, belki de eklentileri (kullanmıyorum :)) veya daha iyi belgeler yüzünden hatırlamıyorum.

Web sayfasındaki VLC'den FLV akışını görüntüleme burada ele alınmıştır: asf ve Flash ile Web Sitesine VLC Akışı

Sorun giderme

Ortaya çıkacak olan sorunların farkında olun. İlk şey, her şeyde olduğu gibi okuyun . VLC çok konuşkan bir program, bu yüzden sorunun nerede olduğunu söyleyecektir. Video / ses cihazına erişim izni, kodlayıcı eksik, yanlış yazılmış - çıkış parametreleri, vb. Sorun olabilir mi ... iftopVerilerin gerçekten ağ üzerinden mi aktığını görmek için kullanmayı öğrenin .


1
Çok teşekkürler! Bu beklediğimden daha fazla bilgi oldu. VLC'ye göz atıp bilgilerinizi kılavuz olarak kullanacaksınız.

3

Buradaki seçim aracım vlc olacaktır . Bu sadece çok amaçlı bir çok formatlı video oynatıcı değil, aynı zamanda çok sayıda dosya formatı ve yayın protokolü olarak da aktarabiliyor. Bonus olarak, Windows ve Linux ana bilgisayarları arasında platformlar arası çalışır.

Ağ bağlantılı web kameralarını geniş bir izleyici kitlesine yönlendirmek için dar bant genişliğine sahip bir DSL hattı (128 K yukarı akış) kullanan bir müşterinin ihtiyaç duyduğu birkaç yıl önce benzer bir şey yaptık. Bir "reflektör" ana bilgisayarı olarak bir VLC kurulumu kam sinyal rotasyonu yaptı, ana bant genişliği yükünü akış istemcilerinden aldı ve akışı farklı akış protokolleri ve formatlarında sundu.


1

Uzmanlık alanım değil, belki de sizi potansiyel bir yöne işaret edebilirim.

Ticari uygulama Adobe'nin Flash Media Server'ı kullanmaktır. Tabii ki, bu oldukça maliyetli bir yaklaşım olabilir. Ancak, açık kaynak alternatifleri var - örneğin Red5 . Sunucuyu kurmanız gerekecek (Java bağımlılıkları var).

Sunucuyu çalıştırdıktan sonra, ön uçunuzu seçebilirsiniz (Red5'in bazı örneklerle geldiğine inanıyorum, ancak JW Player'ı birlikte kullanabilirsiniz type=camera).

Ön uç, akış videosunu medya sunucusundan alır ve akışınızı medya sunucusuna yüklersiniz.

Daha fazla bilgi: Red5 Yardım ve Bilgi ve Red5 Referansı


jwplayer kişisel kullanım için harika bir şeydir
Kendrick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.