การสตรีมสดโดยใช้ FFMPEG


6

นี่เป็นคำถามง่าย ๆ แต่ฉันไม่สามารถหาคำตอบได้ ฉันต้องการสตรีมจากอุปกรณ์จับภาพไปยังเซิร์ฟเวอร์แล้วให้ FFMPEG บนเซิร์ฟเวอร์กำหนดรหัสสตรีมที่เหมาะสมสำหรับ HLS อีกครั้ง

แต่ฉันจะทำสิ่งนี้ได้อย่างไร ฉันดู Flash Media Live Encoder และ VLC และ ffserver แต่ไม่สามารถจัดการกับสิ่งนี้ได้ โดยพื้นฐานแล้วดูเหมือนว่าฉันต้องการโปรแกรมที่ส่งไปยังเซิร์ฟเวอร์ซึ่งยอมรับสตรีม (และอาจมีการรับรองความถูกต้องของผู้ใช้) จากนั้นทำให้สตรีมสามารถใช้งานได้ ฉันมีระบบที่ใช้ไฟล์และเข้ารหัสให้กับ HLS อยู่แล้วดังนั้นฉันจึงสามารถป้อนพารามิเตอร์พารามิเตอร์ชี้ไปที่แอปพลิเคชันนี้บนเซิร์ฟเวอร์ภายในเพื่อรับสตรีมและเริ่มการเข้ารหัส

แก้ไข: เป็นขั้นตอนเดียวเท่านั้นที่จะยอมรับเช่น การเชื่อมต่อ rtmp และทำให้พร้อมใช้งานสำหรับ FFMPEG บนเซิร์ฟเวอร์เดียวกัน ฉันหวังว่าเช่น ffserver สามารถทำเช่นนั้นได้ แต่ฉันไม่คิดอย่างนั้น


จริงๆแล้วนี่เป็นปัญหาที่ยากมากโดยทั่วไป
Jason

คำตอบ:


3

ฉันเจอเซิร์ฟเวอร์สตรีมที่เรียกว่า crtmpserver (หรือ rtmpd) ​​ซึ่งดูเหมือนเล็ก แต่ทำในสิ่งที่ฉันต้องการอย่างแน่นอนด้วยการเปลี่ยนแปลงเล็กน้อยในโค้ด


ลิงค์นี้ล้าสมัยเนื่องจากไม่มี crtmpserver ในหน้านั้น คุณช่วยอัพเดทลิงค์ได้ไหม
Zeta

3

บางทีตัวอย่างการทำงานนี้อาจช่วยคุณได้อีกเล็กน้อย

มันสตรีมสตรีมสด (เว็บแคม) ผ่าน vlc ไปยังหน้าเว็บเป็น hls เว็บแคมสามารถทำได้โดยอุปกรณ์สตรีมมิ่งอื่น ๆ หรือการ์ดจับภาพ หน้าเว็บใช้คุณสมบัติการสตรีมเฉพาะของ HTML5

cvlc v4l2:// :v4l2-vdev="/dev/video0" --sout '#transcode{vcodec=h264,vb=512,scale=1,acodec=none,venc=x264{aud,profile=high,level=60,keyint=15,bframes=0,ref=1,nocabac}}:duplicate{dst=std{access=livehttp{seglen=10,delsegs=true,numsegs=5,index=/var/www/live/mystream.m3u8,index-url=http://"Here your webserverIP"/live/mystream-########.ts},mux=ts{use-key-frames},dst=/var/www/live/mystream-########.ts},dst=std{access=http,mux=ts,dst=:8082/video.mp4}}' &

บรรทัดคำสั่งจะสร้างเอาต์พุตสองสตรีมหนึ่ง HLS หนึ่งสตรีมสำหรับการสตรีมผ่านหน้าเว็บและสตรีม MP4 ที่สามารถเข้าถึงได้โดยตรงโดยเครื่องเล่น VLC ในเครือข่ายเดียวกัน

เพียงแค่ตั้งค่าไดเรกทอรีที่เหมาะสมและใส่ที่อยู่ IP ของเว็บเซิร์ฟเวอร์จริง

สำหรับเว็บเซิร์ฟเวอร์ฉันใช้การตั้งค่ามาตรฐานของ lighttpd และสร้างไฟล์ index.html ด้วยคำจำกัดความสตรีม HTML 5 ต่อไปนี้:

<!DOCTYPE html>
<html>
<head>
    <title>Live Cam</title>
</head>

<body>
    <div id="player">
        <video autoplay="true" controls="controls" width="640" height="480">
            <source src="http://"Here your webserverIP"/live/mystream.m3u8" type="application/x-mpegURL" />
            Your browser does not support HTML5 streaming!
        </video>
    </div>
</body>
</html

เชื่อมต่อเว็บแคมของคุณสร้างไฟล์ index.html รีสตาร์ทเว็บเซิร์ฟเวอร์ของคุณแล้วดำเนินการ commandline (ในฐานะผู้ใช้ปกติ) ทุกอย่างทำงานได้คุณสามารถเข้าถึงแหล่งการสตรีมของคุณบนอุปกรณ์ I ทั้งหมดได้

ฉันพยายามทำเช่นเดียวกันกับ ffmpeg (เซกเมนต์และ hls) ที่มีและไม่มี ffserver และถึงแม้จะมี avconv และ avserver แต่ก็ยังไม่ประสบความสำเร็จ


2

คุณอ่านได้ คู่มือนี้ ซึ่งเป็นประโยชน์อย่างมากในการเรียนรู้การทำงานกับ FFmpeg ในความคิดของฉันคุณควรจะสามารถสร้างทางออกที่ดีโดยใช้คำแนะนำนั้นเพราะทุกๆด้านของ FFmpeg ที่คุณต้องการอยู่ในนั้น นอกจากนี้การแยกโครงการของคุณในส่วนเล็ก ๆ เป็นขั้นตอนที่ยอดเยี่ยม เพียงลองรับกระแสข้อมูลจากอุปกรณ์ของคุณก่อนแล้วลองดูด้วย VLC (ซึ่งใช้ FFmpeg ด้วย) จากนั้นคุณสามารถทำงานบนเซิร์ฟเวอร์เพื่อออกอากาศสตรีมของคุณ โชคดี!


ขอบคุณนิค! ฉันมีส่วน ffmpeg ในสถานที่ ความยากคือการมีบางสิ่งที่ 'อยู่ตรงกลาง' เพื่อยอมรับสมมติว่ามีการเชื่อมต่อ rtmp จาก Flash Media Live Encoder จากนั้นทำให้ FFMPEG พร้อมใช้งาน ฉันต้องการบางสิ่งเพื่อเชื่อมต่อลูกค้าของฉันเพื่อให้ FFMPEG สามารถเชื่อมต่อได้ ฉันมีตัวอย่างของ Red5 ที่ติดตั้งและอาจใช้งานได้ แต่ดูเหมือน overkill เล็กน้อย

1
ฉันไม่รู้ว่าฉันเข้าใจผิดคุณหรือไม่ แต่ FFmpeg สามารถป้อนสตรีมของคุณได้ทันที ใช่คุณสามารถใช้ FFserver ซึ่งเป็นหนึ่งในโปรแกรมที่จัดทำโดย FFmpeg คุณยังสามารถรวมโปรแกรม FFmpeg และโปรแกรม FFserver บนเซิร์ฟเวอร์เดียว นี่คือลิงค์ที่รวมกัน: การสตรีมสื่อด้วย FFserver
Nick van Tilborg

ฉันคิดว่า ffserver รับอินพุตจาก ffmpeg เท่านั้น ฉันจำเป็นต้องเชื่อมต่อโดยใช้ rtmp (หรือบางอย่าง) กับ 'เซิร์ฟเวอร์' เพื่อทำการรีเฟรชและทำให้พร้อมใช้งานกับ ffmpeg ฉันไม่สามารถเชื่อมต่อ ffmpeg ได้โดยตรงเนื่องจากอุปกรณ์จับภาพจะอยู่ที่ใดที่หนึ่งในสนามดังนั้นฉันจึงไม่สามารถไว้ใจได้ว่ามีที่อยู่ IP ฯลฯ เครื่องไคลเอนต์ / เครื่องจับต้องเชื่อมต่อกับเซิร์ฟเวอร์ในบางวิธีดังนั้น ffmpeg จึงมีการเชื่อมต่อคงที่ จุด.

2
ดังนั้นคุณหมายถึงว่าอุปกรณ์นั้นเชื่อมต่อกับเซิร์ฟเวอร์จากนั้นเซิร์ฟเวอร์จะเริ่มฟังสตรีมอุปกรณ์และกระจายข้อมูลนั้นไปยังอินเตอร์เน็ต ในกรณีนี้เพียงแค่สร้างโปรแกรมอย่างง่ายบนเซิร์ฟเวอร์ของคุณซึ่งกำลังฟังสตรีมใหม่ บนอุปกรณ์ของคุณคุณจะส่งทริกเกอร์ไปยังเซิร์ฟเวอร์ของคุณ บนเซิร์ฟเวอร์เมื่อสตรีมใหม่ให้คุณเริ่ม FFmpeg เพื่อป้อนสตรีมนั้นและเริ่มสตรีมออกอากาศ FFmpeg สามารถทำทุกอย่างที่คุณต้องการ และอีกครั้ง FFserver เป็นเพียงโปรแกรมขนาดเล็กที่มีไลบรารีเดียวกับโปรแกรม FFmpeg เริ่มต้นที่ใช้ ลองทำการทดลองกับมัน
Nick van Tilborg

ใช่นั่นคือสิ่งที่ฉันต้องการ ง่ายมาก. อย่างไรก็ตามฉันไม่รู้ว่าฉันมีทักษะด้านเครือข่ายในการเขียนหรือไม่ มาดูตัวอย่างของ Flash Media Live Encoder ฉันแน่ใจว่ามีการจับมือกันเป็นต้นในโปรโตคอล แต่ฉันอาจจะดู มันจะดีอย่างที่ฉันสามารถรวมเข้ากับ Java App ของฉันเองบน Play Framework ซึ่งจะช่วยประหยัดทรัพยากรจำนวนมากและให้การควบคุมการเชื่อมต่อกับฉัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.