Bagaimana cara streaming video langsung dari server linux?

30

Inilah yang ingin saya lakukan. Melihat sekeliling tetapi tidak menemukan jawaban langsung. Saya memiliki kotak Linux yang menjalankan situs web menggunakan Ubuntu / MySQL / Apache. Saya memiliki IP statis saya sendiri juga, yaitu tidak menggunakan web hosting. Saya ingin dapat mengalirkan umpan video dari webcam di laptop (mungkin menjalankan Windows) ke server Linux saya, dan membuat pengguna dari salah satu situs web saya dapat melihat video itu langsung ditayangkan. Tentunya laptop perlu diautentikasi dengan server entah bagaimana, tetapi seharusnya tidak ada batasan siapa yang bisa melihat video langsung di situs web. Terima kasih.


sumber
apakah Anda bertanya bagaimana menerapkan solusi tersebut atau mencari solusi pihak ketiga yang siap digunakan? dalam kasus sebelumnya SO adalah tempat yang salah untuk pertanyaan ini, saya percaya itu adalah alasan downvoting

Jawaban:

46

Saat ini saya mengembangkan streaming online dari 3 kamera miniDV yang terhubung melalui FireWire, yang sangat mirip dengan kebutuhan Anda.

Petunjuk cepat: vlc + flowplayer / pemain jw

Pertama-tama, ada dua format video, yang dapat Anda gunakan dalam streaming online: FLV dan h264. FLV lebih mudah untuk transcode, h264 memiliki ukuran / kualitas rasio yang lebih baik tetapi transcoding jauh lebih memakan cpu. Keduanya dapat ditampilkan oleh pemain flash di halaman web.

Kedua, infrastruktur streaming. Karena bandwidth Anda dari laptop terbatas (beberapa Mbps puncak), Anda perlu melakukan streaming ke server Anda dan mengembalikannya ke klien. Jadi aliran akan mengalir 1 kali ke server dan kemudian N kali ke klien dari sana. Anda belum mendeskripsikan koneksi internet Anda untuk laptop Anda, jadi skenario ini dibagi menjadi dua bagian:

  1. Laptop terhubung dengan alamat IP publik ATAU Anda dapat port NAT ke laptop . Skenario ini jauh lebih mudah, karena Anda dapat terhubung dari server ke laptop yang bagus dan mudah. Kerugian besar adalah, bahwa Anda terikat pada satu lokasi (satu alamat IP).

  2. Laptop tidak terhubung dengan alamat publik saya . Ini sedikit rumit, tetapi akan bekerja dari jaringan apa pun yang memungkinkan Anda untuk SSH ke server Anda dan memiliki unggahan yang memadai (1 Mbps harus melakukannya).

Terlepas dari skenario yang digunakan, infrastruktur akan terlihat seperti ini

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

Streaming dari laptop

  1. Tangkap video dari webcam . Saya tidak pernah menangkap aliran dari webcam yang terpasang secara lokal, tetapi ada banyak contoh bagaimana melakukannya melalui V4L, misalnya: Pengaturan Webcam . Satu-satunya bagian yang harus Anda minati adalah:

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

    Yang merupakan bagian pertama dari perintah VLC untuk terhubung ke webcam. Untuk lebih jelasnya ikuti HOWTO yang disebutkan. Terutama melihat bagian "grup video" dan perbaiki jalur perangkat ke / dev / video dan / dev / audio. Itu bisa berbeda di laptop Anda.

  2. Transcode video ke FLV . Saya pribadi menggunakan FLV, karena kurang menuntut CPU. String transcode yang saya gunakan adalah ini:

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

    Yang akan mentranskode streaming video ke format FLV dengan audio MPGA (MP3 tidak tersedia di Ubuntu saya). Samplerate entah bagaimana wajib, itu tidak akan berfungsi tanpanya. Tetapi Anda dapat memilih yang lebih kecil, seperti 22050. Ini akan mentranskode streaming video 'apa adanya', sehingga skalanya adalah 1: 1. Anda dapat menambahkan parameter lebar dan tinggi, atau bahkan parameter skala. Lihatlah ke dokumentasi VLC.

  3. Streaming dari laptop . Sekarang Anda harus membuat aliran lokal, di mana server akan terhubung:

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

    Ini akan mengikat aliran VLC ke 0.0.0.0:8081/stream.flv. Seluruh perintah akan terlihat seperti ini:

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

Restreaming di server

  1. Abadikan streaming di server dan nyalakan kembali . Sekali lagi, kami menggunakan VLC untuk menangkap dan streaming. Penggunaan didasarkan pada skenario infrastruktur sejak awal posting ini. Seperti yang saya tunjukkan, VLC pada laptop mengalirkan video pada beberapa port. Port ini harus dapat diakses dari server. Jika Anda memiliki alamat IP publik laptop, atau port NATed, Anda dapat mengujinya dengan telnet:

    server$ telnet public_ip_address 8081

    Apa pun kecuali "batas waktu koneksi" akan mengungkapkan, bahwa Anda dapat terhubung ke aliran laptop Anda. Jika Anda tidak memiliki alamat IP publik, atau Anda tidak dapat port NAT, Anda harus melakukannya sebaliknya. Anda dapat SSH dari laptop ke server dan remote forward port laptop Anda ke server. Perintah SSH yang benar adalah:

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

    Perintah ajaib ini akan 'mengikat' port laptop Anda 8081, ke port server 8081. Itu berarti ketika Anda terhubung pada server ke 8081, Anda akan secara diam-diam terhubung ke port laptop 8081 Anda melalui terowongan SSH. Keren, ya? :) Jadi yang harus kita lakukan hanyalah menghubungkan dan streaming VLC sederhana:

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

    Atau dalam hal alamat IP publik atau port 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}'

    Seperti pada bagian laptop, VLC Anda di server terikat ke port 8082. Mengapa 8082 dan bukan 8081? 8081 sudah diambil oleh SSH remote forward. Mengapa kita tidak menggunakan bagian transcode seperti pada contoh pertama? Video sudah dalam format yang benar, jadi yang harus kita lakukan hanyalah streaming apa adanya.

  2. Pengujian . Dalam kedua contoh, Anda dapat menguji fungsionalitas dengan melihat streaming melalui VLC. Anda dapat menguji aliran lokal Anda:

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

    Dan Anda dapat menguji aliran server Anda:

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

    Dalam kedua kasus, Anda akan melihat input webcam Anda.

Tampilkan aliran di web

Menampilkan aliran di web, yang akan berfungsi dalam banyak kasus, adalah melalui flash player. Saya mencoba dua produk, yang gratis untuk penggunaan non-komersial: JW Player dan Flowplayer . Saya tetap menggunakan Flowplayer, tetapi saya tidak ingat alasannya, mungkin karena plugin (yang tidak saya gunakan :)) atau karena dokumentasi yang lebih baik.

Cara menampilkan aliran FLV dari VLC di halaman web tercakup di sini: Streaming VLC ke Situs web dengan asf dan Flash

Penyelesaian masalah

Waspadai banyak masalah yang AKAN timbul. Hal pertama, seperti dalam segala hal, baca . VLC adalah program yang sangat cerewet, jadi itu akan memberi tahu Anda di mana masalahnya. Bisa jadi masalah dengan izin untuk mengakses perangkat video / audio, codec yang hilang, parameter ejaan yang salah, ... Belajar menggunakan iftopuntuk melihat apakah data benar-benar mengalir melalui jaringan, dll.

mkudlacek
sumber
1
Terima kasih banyak! Ini lebih banyak informasi daripada yang saya harapkan. Akan memeriksa VLC dan menggunakan info Anda sebagai panduan.
3

Alat pilihan saya di sini adalah vlc . Ini bukan hanya pemutar video multi-format multi-tujuan, tetapi juga mampu streaming dalam sejumlah besar format file dan protokol streaming. Sebagai bonus, ia bekerja lintas platform di antara host Windows dan Linux.

Kami telah menyiapkan sesuatu yang serupa beberapa tahun yang lalu di mana seorang pelanggan yang menggunakan jalur DSL bandwidth sempit (128 K hulu) harus memiliki webcam yang terhubung ke jaringan yang dialirkan ke khalayak luas. Instalasi VLC sebagai host "reflektor" melakukan rotasi sinyal cam, mengambil beban bandwidth utama dari klien streaming dan menyajikan aliran dalam berbagai protokol dan format streaming.

the-wabbit
sumber
1

Bukan bidang keahlian saya, tapi mungkin saya bisa mengarahkan Anda ke arah yang potensial.

Implementasi komersialnya adalah menggunakan Adobe Media Flash Server. Tentu saja, itu bisa menjadi pendekatan yang agak mahal. Namun ada, alternatif open source - seperti Red5 . Anda harus menginstal server (memiliki dependensi Java).

Setelah server berjalan, Anda dapat memilih front-end Anda (saya percaya Red5 datang dengan beberapa sampel, tetapi Anda juga dapat menggunakan JW Player dengan type=camera).

Ujung depan akan menerima streaming video dari server media, dan Anda akan mengunggah streaming Anda ke server media.

Informasi lebih lanjut: Bantuan & Info Red5 dan Referensi Red5

cyberx86
sumber
jwplayer adalah hal yang luar biasa untuk penggunaan pribadi
Kendrick