วิธีการสตรีมวิดีโอสดจากเซิร์ฟเวอร์ลินุกซ์?


30

นี่คือสิ่งที่ฉันต้องการจะทำ มองไปรอบ ๆ แต่ไม่พบคำตอบที่ตรง ฉันมีกล่อง Linux ที่ใช้งานเว็บไซต์โดยใช้ Ubuntu / MySQL / Apache ฉันมี IP แบบคงที่ของตัวเองเช่นไม่ได้ใช้เว็บโฮสติ้ง ฉันต้องการที่จะสตรีมวิดีโอฟีดจากเว็บแคมบนแล็ปท็อป (ที่ใช้ Windows) ไปยังเซิร์ฟเวอร์ Linux ของฉันและให้ผู้ใช้ของหนึ่งในเว็บไซต์ของฉันสามารถดูวิดีโอสดขณะสตรีมได้ เห็นได้ชัดว่าแล็ปท็อปจะต้องรับรองความถูกต้องกับเซิร์ฟเวอร์ แต่ไม่ควรมีข้อ จำกัด ว่าใครสามารถดูวิดีโอสดบนเว็บไซต์ ขอบคุณ


คุณถามวิธีการนำโซลูชันดังกล่าวไปใช้หรือมองหาโซลูชันบุคคลที่สามที่พร้อมใช้งานหรือไม่ ในกรณีก่อนหน้านี้ SO นั้นผิดที่สำหรับคำถามนี้ฉันเชื่อว่านี่เป็นสาเหตุของการ downvoting

คำตอบ:


46

ปัจจุบันฉันพัฒนาสตรีมมิ่งออนไลน์จากกล้อง miniDV 3 ตัวที่เชื่อมต่อผ่าน FireWire ซึ่งคล้ายกับความต้องการของคุณ

คำใบ้ด่วน: vlc + flowplayer / jw player

ก่อนอื่นมีสองรูปแบบวิดีโอที่คุณสามารถใช้ในการสตรีมออนไลน์ได้: FLV และ h264 FLV นั้นง่ายต่อการแปลงรหัส h264 มีอัตราส่วนต่อขนาด / คุณภาพที่ดีกว่า แต่การแปลงรหัสนั้นใช้ซีพียูมากขึ้น ทั้งสองสามารถแสดงโดยผู้เล่นแฟลชในหน้าเว็บ

ประการที่สองของโครงสร้างพื้นฐานสตรีมมิ่ง เนื่องจากแบนด์วิดท์จากแล็ปท็อปของคุณมี จำกัด (หนึ่งถึงสอง Mbps ท็อป) คุณต้องสตรีมไปยังเซิร์ฟเวอร์ของคุณและส่งสัญญาณให้กับลูกค้า ดังนั้นกระแสจะไหล 1 ครั้งไปยังเซิร์ฟเวอร์และจากนั้นครั้ง N ไปยังลูกค้าจากที่นั่น คุณยังไม่ได้อธิบายการเชื่อมต่ออินเทอร์เน็ตสำหรับแล็ปท็อปของคุณดังนั้นสถานการณ์จะแบ่งออกเป็นสองส่วน:

  1. แล็ปท็อปเชื่อมต่อกับที่อยู่ IP สาธารณะหรือคุณสามารถ NAT พอร์ตแล็ปท็อป สถานการณ์นี้ง่ายขึ้นมากเนื่องจากคุณสามารถเชื่อมต่อจากเซิร์ฟเวอร์ไปยังแล็ปท็อปได้ดีและสะดวก ข้อเสียใหญ่คือคุณถูกผูกไว้กับที่เดียว (ที่อยู่ IP หนึ่งแห่ง)

  2. แล็ปท็อปไม่ได้เชื่อมต่อกับที่อยู่ผมสาธารณะ นี่เป็นเรื่องยุ่งยากเล็กน้อย แต่จะทำงานจากเครือข่ายใด ๆ ที่จะช่วยให้คุณสามารถ SSH ไปยังเซิร์ฟเวอร์ของคุณและอัปโหลดได้อย่างเพียงพอ (1 Mbps ควรทำ)

โดยไม่คำนึงถึงสถานการณ์ที่ใช้ infrastructer จะมีลักษณะเช่นนี้

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

สตรีมจากแล็ปท็อป

  1. การจับภาพวิดีโอจากเว็บแคม ฉันไม่เคยจับกระแสจากเว็บแคมที่แนบมาในประเทศ แต่มีตัวอย่างหลายวิธีที่จะทำผ่านทาง V4L เช่น: ติดตั้งเว็บแคม ส่วนเดียวที่คุณควรสนใจคือ:

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

    ซึ่งเป็นส่วนแรกของคำสั่ง VLC เพื่อเชื่อมต่อกับเว็บแคม สำหรับรายละเอียดเพิ่มเติมตาม HOWTO ที่กล่าวถึง โดยเฉพาะอย่างยิ่งดูที่ส่วน "กลุ่มวิดีโอ" และเส้นทางอุปกรณ์ที่ถูกต้องไปยัง / dev / วิดีโอและ / dev / audio สิ่งเหล่านี้อาจแตกต่างจากแล็ปท็อปของคุณ

  2. วิดีโอแปลงเพื่อ FLV ส่วนตัวผมใช้ FLV เนื่องจากมันใช้ซีพียูน้อย สตริงรหัสที่ฉันใช้คือ:

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

    ซึ่งจะแปลงวิดีโอสตรีมเป็นรูปแบบ FLV พร้อม MPGA audio (MP3 ไม่พร้อมใช้งานใน Ubuntu ของฉัน) การสุ่มตัวอย่างเป็นข้อบังคับอย่างใดมันจะไม่ทำงานหากไม่มี แต่คุณสามารถเลือกขนาดที่เล็กกว่าเช่น 22050 ซึ่งจะแปลงรหัสสตรีมวิดีโอ 'ตามที่เป็น' ดังนั้นขนาดจึงเป็น 1: 1 คุณสามารถผนวกพารามิเตอร์ width และ height หรือพารามิเตอร์ scale ดูในเอกสารประกอบ VLC

  3. สตรีมได้จากแล็ปท็อป ตอนนี้คุณต้องสตรีมโลคัลซึ่งเซิร์ฟเวอร์จะเชื่อมต่อ:

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

    สิ่งนี้จะผูก VLC สตรีมกับ 0.0.0.0:8081/stream.flv คำสั่งทั้งหมดจะมีลักษณะเช่นนี้:

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

กำลังรีเฟรชบนเซิร์ฟเวอร์

  1. จับกระแสบนเซิร์ฟเวอร์และ ReStream มัน อีกครั้งเราใช้ VLC เพื่อจับภาพและสตรีม การใช้งานขึ้นอยู่กับสถานการณ์ของโครงสร้างพื้นฐานตั้งแต่ก่อนโพสต์นี้ ดังที่ฉันได้แสดงให้เห็น VLC บนแล็ปท็อปวิดีโอสตรีมในบางพอร์ต พอร์ตนี้ต้องสามารถเข้าถึงได้จากเซิร์ฟเวอร์ หากคุณมีที่อยู่ IP สาธารณะของแล็ปท็อปหรือพอร์ต NATed คุณสามารถทดสอบด้วย telnet:

    server$ telnet public_ip_address 8081

    อะไรก็ตามยกเว้น "การหมดเวลาเชื่อมต่อ" จะเปิดเผยว่าคุณสามารถเชื่อมต่อกับสตรีมแล็ปท็อปของคุณได้ หากคุณไม่มีที่อยู่ IP สาธารณะหรือคุณไม่สามารถพอร์ต NAT คุณต้องทำอย่างอื่น คุณสามารถ SSH จากแล็ปท็อปไปยังเซิร์ฟเวอร์และส่งต่อพอร์ตแล็ปท็อปไปยังเซิร์ฟเวอร์ระยะไกล คำสั่ง SSH ที่ถูกต้องจะเป็น:

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

    คำสั่งเวทย์มนตร์นี้จะ 'ผูก' พอร์ตแล็ปท็อปของคุณ 8081 ไปยังเซิร์ฟเวอร์พอร์ต 8081 ซึ่งหมายความว่าเมื่อคุณเชื่อมต่อบนเซิร์ฟเวอร์กับ 8081 คุณจะเชื่อมต่อกับพอร์ตแล็ปท็อป 8081 ผ่านอุโมงค์ SSH ในใจ เยี่ยมเลยเหรอ? :) ดังนั้นสิ่งที่เราต้องทำก็คือการเชื่อมต่อและสตรีม VLC แบบง่าย:

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

    หรือในกรณีที่มีที่อยู่ IP สาธารณะหรือพอร์ต 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}'

    เช่นเดียวกับในส่วนแล็ปท็อป VLC ของคุณบนเซิร์ฟเวอร์ถูกผูกเข้ากับพอร์ต 8082 ทำไมต้องเป็น 8082 และไม่ใช่ 8081 8081 ได้ถูกนำไปใช้โดย SSH รีโมตไปข้างหน้า ทำไมเราไม่ใช้ส่วน transcode ดังตัวอย่างแรก? วิดีโอมีรูปแบบที่ถูกต้องอยู่แล้วดังนั้นสิ่งที่เราต้องทำคือเพียงสตรีมตามที่เป็น

  2. การทดสอบ ในทั้งสองตัวอย่างคุณสามารถทดสอบการใช้งานได้ด้วยการดูสตรีมผ่าน VLC คุณสามารถทดสอบกระแสท้องถิ่นของคุณ:

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

    และคุณสามารถทดสอบการสตรีมเซิร์ฟเวอร์ของคุณ:

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

    ในทั้งสองกรณีคุณควรเห็นอินพุตเว็บแคมของคุณ

แสดงกระแสบนเว็บ

การแสดงสตรีมบนเว็บซึ่งส่วนใหญ่จะทำงานผ่านโปรแกรมเล่นแฟลช ฉันพยายามสองผลิตภัณฑ์ซึ่งเป็นฟรีสำหรับการใช้งานที่ไม่ใช่เชิงพาณิชย์: เจดับบลิวเครื่องเล่นและFlowplayer ฉันอยู่กับ Flowplayer แต่ฉันจำไม่ได้ว่าเหตุผลอาจเป็นเพราะปลั๊กอิน (ซึ่งฉันไม่ได้ใช้ :)) หรือเพราะเอกสารที่ดีกว่า

วิธีแสดงสตรีม FLV จาก VLC ในหน้าเว็บครอบคลุมที่นี่: สตรีม VLC ไปยังเว็บไซต์ที่มี asf และ Flash

การแก้ไขปัญหา

ระวังปัญหาต่าง ๆ ที่จะเกิดขึ้น สิ่งแรกในขณะที่ทุกอย่างอ่าน VLC เป็นโปรแกรมที่ช่างพูดมากดังนั้นมันจะบอกคุณว่าปัญหาอยู่ที่ไหน อาจเป็นปัญหาเกี่ยวกับการอนุญาตให้เข้าถึงอุปกรณ์วิดีโอ / เสียงตัวแปลงสัญญาณที่ขาดหายไปสะกดผิด - พารามิเตอร์หมด, ... เรียนรู้การใช้iftopเพื่อดูว่าข้อมูลไหลผ่านเครือข่ายจริงหรือไม่เป็นต้น


1
ขอบคุณมาก! นี่เป็นข้อมูลที่มากกว่าที่ฉันคาดไว้ จะตรวจสอบ VLC และใช้ข้อมูลของคุณเป็นแนวทาง

3

เครื่องมือของฉันเลือกที่นี่จะเป็นVLC มันไม่ได้เป็นเพียงเครื่องเล่นวิดีโออเนกประสงค์หลายรูปแบบ แต่ยังสามารถสตรีมในรูปแบบไฟล์และโปรโตคอลการสตรีม เป็นโบนัสมันทำงานข้ามแพลตฟอร์มระหว่างโฮสต์ Windows และ Linux

เราได้จัดทำสิ่งที่คล้ายกันเมื่อสองสามปีก่อนที่ลูกค้าใช้สาย DSL แบนด์วิดท์แคบ (128 K อัพสตรีม) จำเป็นต้องมีเว็บแคมที่เชื่อมต่อกับเครือข่ายของเขาไปยังผู้ชมในวงกว้าง การติดตั้ง VLC ในฐานะโฮสต์ "ตัวสะท้อน" ทำหน้าที่หมุนสัญญาณแคมใช้โหลดแบนด์วิธหลักจากสตรีมมิ่งไคลเอ็นต์และนำเสนอสตรีมในโปรโตคอลสตรีมมิ่งและรูปแบบที่แตกต่างกัน


1

ไม่ใช่ความเชี่ยวชาญของฉันจริง ๆ แต่บางทีฉันอาจชี้คุณไปในทิศทางที่อาจ

การใช้งานเชิงพาณิชย์คือการใช้ Flash Media Server ของ Adobe แน่นอนว่าอาจเป็นวิธีการที่มีราคาค่อนข้างสูง มี แต่ทางเลือกมาเปิด - เช่นRed5 คุณจะต้องติดตั้งเซิร์ฟเวอร์ (มีการขึ้นต่อกันของ Java)

เมื่อคุณเปิดใช้งานเซิร์ฟเวอร์คุณสามารถเลือก front-end ของคุณ (ฉันเชื่อว่า Red5 มาพร้อมกับตัวอย่างบางส่วน แต่คุณสามารถใช้JW Playerด้วยtype=camera)

ส่วนหน้าจะได้รับวิดีโอสตรีมมิ่งจากเซิร์ฟเวอร์สื่อและคุณจะอัปโหลดสตรีมไปยังเซิร์ฟเวอร์สื่อ

ข้อมูลเพิ่มเติม: Red5 Help & Infoและการอ้างอิง Red5


jwplayer เป็นสิ่งที่ยอดเยี่ยมสำหรับใช้ส่วนตัว
Kendrick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.