Truyền phát qua RTSP hoặc RTP trong HTML5


150

Tôi đang xây dựng một ứng dụng web sẽ phát lại luồng RTSP / RTP từ máy chủ http://lscube.org/projects/feng .

Thẻ video / âm thanh HTML5 có hỗ trợ rtsp hoặc rtp không? Nếu không, giải pháp đơn giản nhất sẽ là gì? Có lẽ thả xuống một plugin VLC hoặc một cái gì đó tương tự.


thẻ video không "chỉ hoạt động" với RTSP. Và RTSP không được thực hiện bởi bất kỳ trình duyệt nào mà tôi biết. Bạn sẽ cần một phích cắm, như bạn đã tìm ra. Hoặc sử dụng webRTC, vốn được Chrome và Firefox hỗ trợ và bạn sẽ có thể sử dụng thẻ video với một số logic webRTC. Nếu bạn đang cố gắng truyền phát từ một nguồn như camera IP, hãy sử dụng dịch vụ phát trực tuyến như Wowza (hoặc tự viết) để chuyển mã từ RTSP sang webRTC. Đây là lời khuyên của tôi cho bạn.
Michael P

Tôi đề nghị đặt câu hỏi này trong StackOverflow cho Hệ thống đa phương tiện
Hamed

Tôi nghĩ rằng bạn có thể truyền phát trực tuyến với html5 nhưng bạn không thể truyền phát đến một nơi nào đó.
Salih Karagoz

Câu hỏi tuyệt vời, cảm ơn bạn. "Tôi tin rằng chúng tôi không hỗ trợ RTSP, chỉ RTMP thông qua videojs-flash." - đây là câu trả lời của người duy trì chính trình phát phương tiện Video.js. Tôi tìm kiếm chủ đề và không thể tìm thấy một giải pháp tốt cho nó.
z cấmirc

Có thể sử dụng RTCPeerConnection của WebRTC để phát RTSP (hay chính xác hơn là luồng RTP mà RTSP thiết lập) trong một phần tử video HTML. Trước đây đã có một bản demo tại webrtc.live555.com . Thủ thuật sẽ là tìm một máy chủ RTSP đã thêm các biểu tượng cảm ứng WebRTC DTLS và SRTP cần thiết.
sipwiz

Câu trả lời:


89

Về mặt kỹ thuật 'Có'

(nhưng không thực sự ...)

<video>Thẻ của HTML 5 là giao thức bất khả tri, nó không quan tâm. Bạn đặt giao thức trong srcthuộc tính như một phần của URL. Ví dụ:

<video src="rtp://myserver.com/path/to/stream">
    Your browser does not support the VIDEO tag and/or RTP streams.
</video>

hoặc có thể

<video src="http://myserver.com:1935/path/to/stream/myPlaylist.m3u8">
    Your browser does not support the VIDEO tag and/or RTP streams.
</video>

Điều đó nói rằng, việc thực hiện các <video>thẻ là trình duyệt cụ thể. Vì đó là những ngày đầu cho HTML 5, tôi mong đợi sự hỗ trợ thay đổi thường xuyên (hoặc thiếu hỗ trợ).

Từ thông số HTML5 của W3C ( Phần tử video ):

Tác nhân người dùng có thể hỗ trợ bất kỳ codec video và âm thanh và định dạng chứa


3
CẬP NHẬT : đã thử phương pháp đầu tiên trong chrome và got GET rtp://239.255.0.1:6970 net::ERR_UNKNOWN_URL_SCHEME. Có vẻ như chỉ các lược đồ HTTP [S] được cho phép trên videocác phần tử.
Yan Foto

Chắc chắn bạn sẽ không bao giờ chuyển video qua HTTP và chỉ sử dụng giao thức như RTP? Nó sẽ rất chậm so với TCP ..
markmnl

7
@markmnl Đó có phải là sự mỉa mai? (Tôi không thể nói ... Tôi tin tưởng theo cách đó.) Truyền tải HTTP là phương pháp thống trị để truyền video qua web trong một vài năm nay. Youtube, Netflix và cộng sự. Đó không phải là vấn đề hiệu quả, mà là sự đơn giản, xuyên tường lửa, thân thiện với máy chủ bộ đệm, v.v.
Stu Thompson

Netflix truyền phát video bằng HTTP?! Không có mỉa mai chỉ là một cách không hiệu quả để truyền phát video.
markmnl

6
@markmnl Vì lợi ích của hậu thế, điều đáng nói là Netflix đã từng phát trực tuyến với MS Silverlight, nhưng đã bỏ nó một thời gian trước. Là một người đã phát trực tuyến từ năm 2001, ban đầu tôi đã bị sốc khi thấy HTTP tiếp quản. Bây giờ tôi đang uống Kool Aid. Trong các mạng công ty, nơi vấn đề hiệu quả, các giao thức được xây dựng có mục đích RTP là tiêu chuẩn, đặc biệt là khi có thể cung cấp các tính năng như phát đa hướng.
Stu Thompson

55

Tinh thần của câu hỏi, tôi nghĩ, đã không thực sự được trả lời. Không, hiện tại bạn không thể sử dụng thẻ video để phát các luồng rtsp. Câu trả lời khác liên quan đến liên kết đến "không bao giờ" của anh chàng Chromium là hơi sai lệch vì chủ đề / câu trả lời được liên kết không liên quan trực tiếp đến Chrome đang chơi rtsp thông qua thẻ video. Đọc toàn bộ chủ đề được liên kết, đặc biệt là các ý kiến ​​ở dưới cùng và liên kết đến các chủ đề khác.

Câu trả lời thực sự là đây: Không, bạn không thể chỉ cần đặt một thẻ video trên trang html 5 và chơi rtsp. Bạn cần sử dụng một thư viện Javascript nào đó (trừ khi bạn muốn chơi mọi thứ với đèn flash và trình phát ánh sáng bạc) để phát video trực tuyến. {IMHO} Với tốc độ thảo luận và triển khai video html 5 đang diễn ra, các nhà cung cấp khác nhau của các tiêu chuẩn video độc quyền không quan tâm đến việc giúp tiến lên phía trước, vì vậy đừng tính đến việc dễ dàng sử dụng thẻ video trừ khi các nhà sản xuất trình duyệt hãy tự mình giải quyết vấn đề bằng cách nào đó ... một lần nữa, không có khả năng. {/ IMHO}


1
Nhận xét tốt Golf. Tôi cũng muốn làm những gì Elben đang làm mà không thành công.
will824

31

Đây là một phương pháp cũ, nhưng tôi đã phải tự mình thực hiện gần đây và tôi đã đạt được một cái gì đó hoạt động (ngoài phản hồi như của tôi sẽ giúp tôi tiết kiệm thời gian): Về cơ bản sử dụng ffmpeg để thay đổi container thành HLS, hầu hết các luồng IPCams h264 và một số loại PCM cơ bản, vì vậy hãy sử dụng một cái gì đó như thế:

ffmpeg -v info -i rtsp://ip:port/h264.sdp -c:v copy -c:a copy -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 /var/www/html/test.m3u8

Sau đó, sử dụng video.js với plugin HLS Điều này sẽ phát Live stream độc đáo Ngoài ra còn có một ví dụ jsfiddle dưới liên kết thứ hai).

Lưu ý: mặc dù đây không phải là hỗ trợ riêng nhưng nó không yêu cầu thêm bất cứ điều gì về giao diện người dùng.


Nó hoạt động với tôi, Videojs tôi đã sử dụng và plugin HLS này làm cho kênh trực tiếp với tệp m3u8 hoạt động với hầu hết các url, nếu không phải là tất cả.
Dheeraj Thedijje

Vui vì nó đã giúp, có một chút độ trễ mặc dù, nhưng điều đó dường như không thể được giúp đỡ nhiều.
Pawel K

1
Hãy thử điều này @Cesar:ffmpeg -v info -rtsp_transport tcp -i rtsp://host:port/[sdp] -c:v copy -c:a copy -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 /var/www/html/test.m3u8
Pawel K

1
@Arter Về cơ bản, bạn cần chạy nó trên máy chủ của bạn (từ dòng lệnh) như hộp Linux hoặc một cái gì đó từ xa. Bạn cần có quyền truy cập vào thư mục / var / www / html / (trong ví dụ này) từ góc độ người dùng hiện tại. Bạn cũng có thể thử làm điều đó trên các cửa sổ với sự trợ giúp của ngăn xếp LAMP hoặc Máy chủ thống nhất (giải pháp gọn gàng hơn nhiều)
Pawel K

1
Điều này làm việc cho tôi. 'hls_wrap' không được dùng trong ffmpeg mới nhất. Tôi đã sử dụng dòng lệnh này cho bất kỳ ai quan tâm:ffmpeg.exe -fflags nobuffer -rtsp_transport tcp -i rtsp://[SOURCE] -flags +cgop -g 30 -hls_flags delete_segments [DESTINATION]
DanTheMan

19

Chrome sẽ không bao giờ triển khai hỗ trợ phát trực tuyến RTSP.

Ít nhất, theo lời của một nhà phát triển Chromium tại đây :

chúng tôi sẽ không bao giờ thêm hỗ trợ cho việc này


4
Cũng gần như vậy. Chrome đã hỗ trợ phát trực tuyến RTSP, đó là lý do tại sao anh ấy sẽ không bao giờ thêm hỗ trợ cho việc này;)
Stefan Steiger

2
Không, bạn không thể làm cho nó hoạt động trong chrome, Nó không hoạt động khi thử với các liên kết rtsp youtube.
IdidntKnewIt 27/12/14

18

Có ba giao thức / công nghệ phát trực tuyến trong HTML5:

Phát trực tiếp, độ trễ thấp - WebRTC - Websocket

VOD và phát trực tiếp, độ trễ cao - HLS

1. WebRTC

Trong thực tế, WebRTC là SRTP (giao thức RTP an toàn). Do đó, chúng ta có thể nói rằng thẻ video hỗ trợ RTP (SRTP) gián tiếp thông qua WebRTC.

Do đó, để có được luồng RTP trên Chrome, Firefox hoặc một trình duyệt HTML5 khác, bạn cần một máy chủ WebRTC sẽ cung cấp luồng SRTP cho trình duyệt.

2. Websocket

Nó dựa trên TCP, nhưng có độ trễ thấp hơn so với HLS. Một lần nữa bạn cần một máy chủ Websocket.

3. HLS

Giao thức truyền phát độ trễ cao phổ biến nhất cho VOD (video được quay trước).


3
Làm thế nào để bạn phát một luồng âm thanh + video trực tiếp bằng cách sử dụng ổ cắm web? Cách duy nhất cho video là sử dụng Broadway.js và điều đó khá khó khăn khi sử dụng các luồng h264 nal.
đánh dấu gamache

1
HLS là viết tắt của HTTP Live Streaming, tôi tự hỏi tại sao HLS được sử dụng rộng rãi cho VOD mà không phải LOD?
shintaroid

1
Bạn không thể phát video trong trình duyệt web từ WebSocket. Ít nhất là không ra khỏi hộp.
Michael IV

-1, cho ổ cắm web ... nhưng không phải vì tất cả các lý do khác mà mọi người đang nói. Bạn hoàn toàn có thể phát video bằng cách nhận dữ liệu qua websocket. Đây là chuyện nhỏ, với Tiện ích mở rộng MediaSource. Mặc dù vậy, bạn không nên, vì bạn có thể sử dụng HTTP Progressive ngay lập tức!
Brad

8

Với VLC, tôi có thể chuyển mã luồng RTSP trực tiếp (mpeg4) sang luồng HTTP theo định dạng OGG (Vorbis / Theora). Chất lượng kém nhưng video hoạt động trong Chrome 9. Tôi cũng đã thử nghiệm với tính năng mã hóa trong WEBM (VP8) nhưng dường như nó không hoạt động (VLC có tùy chọn nhưng tôi không biết bây giờ nó có thực sự được triển khai không. .)

Người đầu tiên có tài liệu về điều này sẽ thông báo cho chúng tôi;)


2
"C:\Program Files\VideoLAN\VLC\vlc.exe" -I dummy screen:// :screen-fps=16.000000 :screen-caching=100 :sout=#transcode{vcodec=theo,vb=800,scale=1,width=600,height=480,acodec=mp3}:http{mux=ogg,dst=127.0.0.1:8080/desktop.ogg} :no-sout-rtp-sap :no-sout-standard-sap :ttl=1 :sout-keep- đây là lệnh VLC truyền luồng đầu vào của bạn (ví dụ: thiết bị chụp màn hình) đến luồng đầu ra nhất định (ví dụ: 127.0.0.1:8080/desktop.ogg )
Zsolt

1
và sau đó bạn có thể nhúng cái này vào thẻ video : <video id="video" src="http://localhost:8080/desktop.ogg" autoplay="autoplay">.
Zsolt

2
Nhưng hiệu suất không may là khá kém và sẽ rất tuyệt nếu nó cũng có thể được thực hiện với thùng chứa MP4. AFAIK nhiều trình duyệt có hỗ trợ MP4 hơn cho OGG.
Zsolt

1
Nó làm việc cho tôi quá. Tôi đã đặt VLC để truyền phát cả âm thanh và video qua giao thức HTTP trên my_ip:portđịa chỉ và hơn là tôi đã sử dụng <video>thẻ HTML5 như thế này : <video width="640"><source src="http://my_ip:port/test" type="video/ogg">HTML5 not supported</video>.
patryk.beza

1

Những quan sát của tôi về thẻ video HTML 5 và luồng rtsp (rtp) là, nó chỉ hoạt động với konqueror (KDE 4.4.1, Phonon-backend được đặt thành GStreamer). Tôi chỉ nhận được video (không có âm thanh) với luồng H.264 / AAC RTSP (RTP).

Các luồng từ http://media.esof2010.org/ không hoạt động với konqueror (KDE 4.4.1, Phonon-backend được đặt thành GStreamer).


1

Chrome không triển khai hỗ trợ phát trực tuyến RTSP. Một dự án quan trọng để kiểm tra nó WebRTC.

"WebRTC là một dự án mở, miễn phí, cung cấp các trình duyệt và ứng dụng di động với khả năng Truyền thông thời gian thực (RTC) thông qua các API đơn giản"

Các trình duyệt được hỗ trợ:

Chrome, Firefox và Opera.

Nền tảng di động được hỗ trợ:

Android và iOS

http://www.webrtc.org/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.