Jak przesyłać strumieniowo wideo na żywo z serwera Linux?


30

Oto co chcę zrobić. Rozejrzał się, ale nie znalazł prostej odpowiedzi. Mam Linux-a działającego na stronach internetowych używających Ubuntu / MySQL / Apache. Mam też swój własny statyczny adres IP, tzn. Nie korzystam z hostingu. Chciałbym móc przesyłać strumieniowo strumień wideo z kamery internetowej na laptopie (prawdopodobnie z systemem Windows) na mój serwer Linux, a użytkownicy jednej z moich stron internetowych mogą widzieć ten film na żywo w trakcie jego przesyłania. Oczywiście laptop musiałby w jakiś sposób uwierzytelnić się na serwerze, ale nie powinno być żadnych ograniczeń dotyczących tego, kto może oglądać wideo na żywo w witrynie. Dzięki.


pytasz, jak wdrożyć takie rozwiązanie, czy szukasz gotowego do użycia rozwiązania innej firmy? w poprzednim przypadku SO jest niewłaściwym miejscem na to pytanie, uważam, że jest to powód do głosowania w dół

Odpowiedzi:


46

Obecnie rozwijam streaming online z 3 kamer miniDV podłączonych przez FireWire, co jest dość podobne do twoich potrzeb.

Szybka wskazówka: vlc + flowplayer / jw player

Przede wszystkim istnieją dwa formaty wideo, których można użyć do strumieniowania online: FLV i h264. FLV jest łatwiejszy do transkodowania, h264 ma lepszy stosunek wielkości do jakości, ale transkodowanie zużywa znacznie więcej procesorów. Oba mogą być wyświetlane przez odtwarzacze flash na stronie internetowej.

Po drugie, infrastruktura przesyłania strumieniowego. Ponieważ twoje pasmo z laptopa jest ograniczone (kilka szczytów Mbps), musisz dostać strumień na serwer i tam ponownie przesłać go do klientów. Tak więc strumień będzie płynął 1 raz do serwera, a następnie N razy do klientów stamtąd. Nie opisałeś swojego połączenia internetowego dla swojego laptopa, więc scenariusz jest podzielony na dwie części:

  1. Laptop jest połączony z publicznym adresem IP LUB możesz podłączyć port NAT do laptopa . Ten scenariusz jest znacznie łatwiejszy, ponieważ możesz łatwo i łatwo połączyć się z serwera na laptopa. Dużą wadą jest to, że jesteś związany z jedną lokalizacją (jednym adresem IP).

  2. Laptop nie jest połączony z adresem I publicznym . Jest to trochę trudne, ale będzie działać z dowolnej sieci, która pozwoli ci na SSH na twój serwer i mieć wystarczającą ilość wysyłania (powinno to zrobić 1 Mbps).

Niezależnie od zastosowanego scenariusza, infrastruktury będzie wyglądać tak

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

Streaming z laptopa

  1. Przechwytuj wideo z kamery internetowej . Nigdy nie przechwytywałem strumienia z lokalnie podłączonej kamery internetowej, ale istnieje wiele przykładów, jak to zrobić za pomocą V4L, np .: Konfiguracja kamery internetowej . Jedyną częścią, którą powinieneś być zainteresowany, jest:

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

    Która jest pierwszą częścią polecenia VLC do połączenia z kamerą internetową. Aby uzyskać więcej informacji, postępuj zgodnie ze wspomnianym HOWTO. Zwłaszcza spójrz na część „grupa wideo” i popraw ścieżkę urządzenia do / dev / video i / dev / audio. Mogą być różne na twoim laptopie.

  2. Transkoduj wideo do FLV . Ja osobiście używam FLV, ponieważ jest on mniej wymagający pod względem procesora. Ciąg transkodowania, którego używam, to:

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

    Który transkoduje strumień wideo do formatu FLV z dźwiękiem MPGA (MP3 nie jest dostępny w moim Ubuntu). Próbkowanie jest w jakiś sposób obowiązkowe, bez niego nie będzie działać. Możesz jednak wybrać mniejszy, na przykład 22050. Spowoduje to transkodowanie strumienia wideo „tak jak jest”, więc skala wynosi 1: 1. Możesz dołączyć parametry szerokości i wysokości, a nawet parametr skali. Zajrzyj do dokumentacji VLC.

  3. Przesyłaj strumieniowo z laptopa . Teraz musisz utworzyć strumień lokalny, do którego serwer się połączy:

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

    Powiąże to strumień VLC z 0.0.0.0:8081/stream.flv. Całe polecenie będzie wyglądać następująco:

    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}'

Ponowne uruchamianie na serwerze

  1. Przechwyć strumień na serwerze i uruchom go ponownie . Ponownie używamy VLC do przechwytywania i przesyłania strumieniowego. Wykorzystanie oparte jest na scenariuszu infrastrukturalnym z początku tego postu. Jak pokazałem, VLC na laptopie przesyła wideo na jakimś porcie. Ten port musi być dostępny z serwera. Jeśli masz publiczny adres IP laptopa lub port NATed, możesz go przetestować za pomocą telnet:

    server$ telnet public_ip_address 8081

    Wszystko oprócz „limitu czasu połączenia” ujawni, że możesz połączyć się ze strumieniem laptopa. Jeśli nie masz publicznego adresu IP lub nie możesz portu NAT, musisz to zrobić na odwrót. Możesz SSH z laptopa na serwer i zdalnie przekierować port laptopa na serwer. Prawidłowe polecenie SSH to:

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

    To magiczne polecenie „powiąże” port 8081 laptopa z portem 8081 serwera. Oznacza to, że po podłączeniu serwera do 8081 po cichu połączysz się z portem 8081 laptopa przez tunel SSH. Fajnie, co? :) Więc wszystko, co musimy zrobić, to proste połączenie VLC i przesyłanie strumieniowe:

    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}'

    Lub w przypadku publicznego adresu IP lub portu NATed:

    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}'

    Podobnie jak w części dotyczącej laptopa, twoja VLC na serwerze jest powiązana z portem 8082. Dlaczego 8082, a nie 8081? 8081 jest już zajęty przez zdalny przekaźnik SSH. Dlaczego nie używamy transkodowania części jak w pierwszym przykładzie? Film jest już w odpowiednim formacie, więc wszystko, co musimy zrobić, to po prostu przesłać go strumieniowo w obecnej postaci.

  2. Testowanie . W obu przykładach możesz przetestować funkcjonalność, przeglądając strumienie za pomocą VLC. Możesz przetestować swój lokalny strumień:

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

    I możesz przetestować strumień swojego serwera:

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

    W obu przypadkach powinieneś zobaczyć wejście kamery internetowej.

Wyświetl strumień w sieci

Wyświetlanie strumienia w Internecie, który będzie działał w większości przypadków, odbywa się za pomocą Flash Playera. Wypróbowałem dwa produkty, które są bezpłatne do niekomercyjnego użytku: JW Player i Flowplayer . Zostałem przy Flowplayer, ale nie pamiętam powodu, może z powodu wtyczek (których nie używam :)) lub z powodu lepszej dokumentacji.

Jak wyświetlić strumień FLV z VLC na stronie internetowej jest omawiany tutaj: Stream VLC do strony internetowej za pomocą asf i Flash

Rozwiązywanie problemów

Bądź świadomy wielu problemów, które pojawią się. Po pierwsze, jak we wszystkim, czytaj . VLC jest bardzo rozmownym programem, więc powie ci, gdzie jest problem. Może to być problem z uprawnieniami dostępu do urządzenia wideo / audio, brakującymi kodekami, błędnie napisanymi parametrami out ... Naucz się używać, iftopaby sprawdzić, czy dane naprawdę przepływają przez sieć itp.


1
Wielkie dzięki! To było więcej informacji, niż się spodziewałem. Sprawdzę VLC i użyje twoich informacji jako przewodnika.

3

Moim wyborem tutaj byłoby VLC . Jest to nie tylko wielofunkcyjny odtwarzacz wideo w wielu formatach, ale także może przesyłać strumieniowo w wielu formatach plików i protokołach przesyłania strumieniowego. Jako bonus, działa między platformami wśród hostów Windows i Linux.

Kilka lat temu stworzyliśmy coś podobnego, w którym klient korzystający z wąskopasmowej linii DSL (128 K upstream) potrzebował, aby jego kamery sieciowe były przesyłane strumieniowo do szerokiego grona odbiorców. Instalacja VLC jako hosta „odbijającego” dokonała rotacji sygnału kamery, przejęła główne obciążenie przepustowości od klientów przesyłania strumieniowego i przedstawiła strumień w różnych protokołach i formatach przesyłania strumieniowego.


1

Nie do końca moja specjalizacja, ale być może uda mi się wskazać potencjalny kierunek.

Wdrożenie komercyjne polega na wykorzystaniu Flash Media Server firmy Adobe. Oczywiście może to być dość kosztowne podejście. Istnieją jednak alternatywy open source - takie jak Red5 . Musisz zainstalować serwer (ma on zależności Java).

Gdy masz serwer działa, można wybrać swój front-end (wierzę Red5 jest wyposażony w kilka próbek, ale można też użyć JW Playera z type=camera).

Interfejs odbierze przesyłane strumieniowo wideo z serwera multimediów, a Ty prześlesz strumień na serwer multimediów.

Więcej informacji: Pomoc i informacje o Red5 i Dokumentacja Red5


jwplayer to niesamowita rzecz do użytku osobistego
Kendrick
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.