RTSP 和 RTMP原理 & 通過ffmpeg實現(xiàn)將本地攝像頭推流到RTSP服務(wù)器
一、流媒體:RTSP 和 RTMP
0、參考資料
-
秒懂流媒體協(xié)議 RTMP 與 RTSP
-
什么是RTMP 和 RTSP?它們之間有什么區(qū)別?
-
RTSP和RTMP的區(qū)別是什么?
1、RTSP 和 RTMP的工作原理
1)RTSP工作原理
-
用戶設(shè)備向視頻流平臺發(fā)送 RTSP 請求
-
視頻流平臺返回可以操作的請求列表,比如播放、暫停等
-
用戶設(shè)備向視頻流平臺發(fā)送具體的請求,比如播放
-
視頻流平臺解析請求并調(diào)用指定機(jī)制啟動視頻流處理
-
由于 RTSP 依賴于專用服務(wù)器,并且依賴于 RTP(底層用到了UDP),因此該協(xié)議不支持加密視頻內(nèi)容或重傳丟失的數(shù)據(jù)包。
這里解釋一下
RTSP
中是如何用到UDP
和TCP
的:-
RTP協(xié)議,英文全稱:Real-time Transport Protocol,中文就是實時傳輸協(xié)議,它的底層其實就是UDP,這樣一來就可以實現(xiàn)低延遲。
-
除了RTP協(xié)議,為確保流暢和一致的流傳輸,RTSP 還使用另外兩種網(wǎng)絡(luò)通信協(xié)議:
-
TCP
收發(fā)控制命令(例如播放或停止請求):TCP可靠傳輸,比如用戶按下播放或者停止播放的時候,這個是個準(zhǔn)確的請求,這個需要保證可靠性,這個時候TCP作用就體現(xiàn)了。 -
UDP
傳送音頻、視頻和數(shù)據(jù):UDP是低延遲的協(xié)議,那么用于傳送音頻、視頻和數(shù)據(jù)可以達(dá)到非常高效的效果。
-
-
這里可以通過開源的rtsp服務(wù)器可以簡單理解:TCP
監(jiān)聽端口為8554,UDP
監(jiān)聽端口為8000
2)RTMP工作原理
-
攝像頭捕獲視頻
-
通過編碼器將視頻流傳輸?shù)?strong>視頻平臺服務(wù)器
-
視頻平臺處理視頻流
-
通過CDN分發(fā)到離用戶最近的服務(wù)器上
-
最后視頻流就能成功的到達(dá)用戶設(shè)備
在視頻從攝像頭到服務(wù)器的過程中,RTMP將大量數(shù)據(jù)分割成小塊并跨多個虛擬通道傳輸(內(nèi)容分發(fā)網(wǎng)絡(luò)CDN),在視頻源和 RTMP 服務(wù)器之間提供了穩(wěn)定和流暢的視頻流。
2、RTSP 和 RTMP的優(yōu)缺點
1)RTSP的優(yōu)缺點
-
RTSP的優(yōu)點:
1、輕松自定義流:可以通過結(jié)合不同的協(xié)議來開發(fā)自己的視頻流解決方案。
2、分段流式傳輸:RTSP 流使觀看者能夠在下載完成之前訪問的視頻內(nèi)容,而不必下載完整的視頻以流式傳輸內(nèi)容。
-
RTSP的缺點:
1、與 HTTP不兼容:沒有簡單的解決方案可以在 Web 瀏覽器中播放 RTSP流,因為 RTSP 旨在通過私有網(wǎng)絡(luò)流式傳輸視頻,必須借用額外軟件。
2、使用率低:由于視頻播放器和流媒體服務(wù)并未廣泛支持 RTSP 流媒體,因為使用率比較低。
2)RTMP的優(yōu)缺點
-
RTMP的優(yōu)點:
1、低延遲:RTMP使用獨占的 1935 端口,無需緩沖,可以實現(xiàn)低延遲。
2、適應(yīng)性強(qiáng):所有 RTMP 服務(wù)器都可以錄制直播媒體流,同時還允許觀眾跳過部分廣播并在直播開始后加入直播流。
3、靈活性:RTMP 支持整合文本、視頻和音頻,支持
MP3
和AAC
音頻流,也支持MP4、FLV
和F4V
視頻。 -
RTMP的缺點:
1、HTML5 不支持:標(biāo)準(zhǔn)HTML5 播放器不支持 RTMP 流。
2、容易受到帶寬問題的影響:RTMP 流經(jīng)常會出現(xiàn)低帶寬問題,造成視頻中斷。
3、HTTP 不兼容:無法通過 HTTP 流式傳輸 RTMP,必須需要實現(xiàn)一個特殊的服務(wù)器,并使用第三方內(nèi)容交付網(wǎng)絡(luò)或使用流媒體視頻平臺。
3)RTSP和RTMP的比較
RTMP 和 RTSP協(xié)議 都是流媒體協(xié)議:
- RTMP(Real Time Message Protocol 實時消息傳遞協(xié)議) 有 Adobe 公司提出,用來解決多媒體數(shù)據(jù)傳輸流的多路復(fù)用(Multiplexing)和分包(packetizing)的問題,優(yōu)勢在于低延遲,穩(wěn)定性高,支持所有攝像頭格式,瀏覽器加載
flash
插件就可以直接播放。 - RTSP (Real-Time Stream Protocol 實時流協(xié)議)由Real Networks 和 Netscape共同提出的,基于文本的多媒體播放控制協(xié)議。RTSP定義流格式,流數(shù)據(jù)經(jīng)由RTP傳輸;RTSP實時效果非常好,適合視頻聊天,視頻監(jiān)控等方向。
RTMP 和 RTSP協(xié)議 的區(qū)別:
-
RTSP雖然實時性最好,但是實現(xiàn)復(fù)雜,適合視頻聊天和視頻監(jiān)控;
-
RTMP強(qiáng)在瀏覽器支持好,加載flash插件后就能直接播放,所以非?;穑喾丛跒g覽器里播放rtsp就很困難了。
3、RTSP和RTMP如何選擇
-
IP 攝像機(jī)選擇RTSP:幾乎所有 IP 攝像機(jī)都支持 RTSP,這是因為 IP 攝像機(jī)早在 RTMP 協(xié)議創(chuàng)建之前就已經(jīng)存在,與 RTSP 和 IP 攝像機(jī)結(jié)合使用時,IP 攝像機(jī)本身充當(dāng) RTSP 服務(wù)器,這意味著要將攝像機(jī)連接到 IP 攝像機(jī)服務(wù)器并廣播視頻。
-
物聯(lián)網(wǎng)設(shè)備選擇RTSP:RTSP 通常內(nèi)置在無人機(jī)或物聯(lián)網(wǎng)軟件中,從而可以訪問視頻源,它的好處之一是低延遲,確保視頻中沒有延遲,這對于無人機(jī)來說至關(guān)重要。
-
流媒體應(yīng)用程序選擇RTMP:比如各種短視頻軟件、視頻直播軟件等都內(nèi)置了RTMP,RTMP 是為滿足現(xiàn)代流媒體需求而設(shè)計的。
4、如何在瀏覽器上播放RTSP
-
直播的協(xié)議有:
rtmp
,http
,rtsp
等等。最常用的有二種:http, rtmp,當(dāng)使用http
協(xié)議的時候視頻格式需要是m3u8
或flv
,下面作詳細(xì)說明各種環(huán)境的優(yōu)缺點。首先,rtsp
不能使用于網(wǎng)頁環(huán)境(包含PC端和移動端),那么直播只能選擇rtmp
或http
。 -
rtmp
協(xié)議只支持flashplayer
,也就是只能在PC端(或安卓環(huán)境中安裝了flashplayer組件,這種環(huán)境比較少)安裝了flashplayer
的情況下使用。按現(xiàn)在的趨勢,flashplayer
是要逐漸被淘汰掉的。當(dāng)然,在中國還會存在相對長時間。 -
http
協(xié)議的直播分二種格式,m3u8
和flv
。flv
是一種即將被淘汰的直播格式。用來做直播已顯的力不從心了。所以綜合考慮,m3u8
相對的比較好點,優(yōu)點是支持移動端,并且支持PC端上安裝了flashplayer的環(huán)境。缺點就如同rtmp
一樣。flashplayer并不是未來的發(fā)展趨勢。另外一個缺點就是m3u8
是有延遲的。并不能實時,實時傳輸方面不如rtmp協(xié)議。因為m3u8
的直播原理是將直播源不停的壓縮成指定時長的ts
文件(比如9秒,10秒一個ts文件)并同時實時更新m3u8文件里的列表以達(dá)到直播的效果。這樣就會有一個至少9,10秒的時間延遲。如果壓縮的過小,可能導(dǎo)致客戶端網(wǎng)絡(luò)原因致視頻變卡。實現(xiàn)
rtsp
轉(zhuǎn)http
并使用m3u8
格式進(jìn)行直播 可以參考RTSP Webcam to HLS Live Streaming using FFMPEG and XAMPP | PART 1具體過程:外接支持
rtsp
的webcam
;使用ffplay
命令來播放rtsp流,可以根據(jù)參數(shù)將實時視頻寫入到指定文件夾中(分段寫入);xampp
開啟apache(開啟80端口),可以讓頁面通過保存的m3u8
文件實時訪問webcam
的監(jiān)控界面。
二、ffmpeg將本地攝像頭推流到RTSP服務(wù)器
0、ffmpeg
參考資料
- FFmpeg Protocols Documentation
- FFmpeg中文文檔
- FFmpeg流媒體處理-收流與推流
- FFmpeg發(fā)送流媒體的命令(UDP,RTP,RTMP)
-
ffmpeg將本地攝像頭推流到RTSP服務(wù)器
- ffmpeg–使用命令+EasyDarwin推流筆記本攝像頭
- windows環(huán)境下,搭建RTSP視頻推流服務(wù)器
- windows環(huán)境下python使用ffmpeg rtsp推流
- 一個RtspServer的設(shè)計與實現(xiàn)和RTSP2.0簡介
- RTSP Webcam to HLS Live Streaming using FFMPEG and XAMPP | PART 1
Note:ffmpeg
將本地攝像頭推流到rtsp
的8554
端口上(rtsp-simple-server
在處理rtsp
時,監(jiān)聽的是8554
端口,指定其他端口ffmpeg
推流會失敗)
1、安裝ffmpeg
和rtsp-simple-server
大致實現(xiàn)過程:使用
rtsp-simple-server
作為中轉(zhuǎn)服務(wù)器,用于ffmpeg
(寫客戶端)推流,后臺服務(wù)(讀客戶端)拉流
1)windows安裝rtsp-simple-server
和ffmpeg
參考windows環(huán)境下,搭建RTSP視頻推流服務(wù)器即可(記得修改rtsp-simple-server.yml
配置文件中的ip地址)
2)linux安裝rtsp-simple-server
和ffmpeg
-
安裝rtsp-simple-server_v0.20.2_linux_amd64.tar.gz(這里以x86 CPU為例),解壓后修改
rtsp-simple-server.yml
配置文件中的ip地址(vim
替換命令為%s:/127.0.0.1/192.168.132.100/g
),執(zhí)行./rtsp-simple-server
即可啟動rtsp服務(wù)器。如果要想在后臺啟動
rtsp
服務(wù)器,執(zhí)行如下命令nohup ./rtsp-simple-server >> rtsp_server.log 2>&1 & #非掛起啟動命令 tail rtsp_server.log #查看rtsp-simple-server啟動日志文件 ps -aux | grep rtsp_simple_server #查看rtsp-simple-server進(jìn)程 dpf 2116 0.0 0.0 13140 1016 pts/0 S+ 04:54 0:00 grep --color=auto rtsp_simple_server
-
ffmpeg
安裝地址如下https://johnvansickle.com/ffmpeg/,解壓后執(zhí)行./ffmpeg
即可使用ffmpeg
,參考在linux下使用ffmpeg方法
Note:在linux中關(guān)于tar.gz
,xz
,tar
的解壓操作請自行上網(wǎng)查閱。
2、將本地攝像頭推流到RTSP服務(wù)器
大致實現(xiàn)過程:使用
rtsp-simple-server
作為中轉(zhuǎn)服務(wù)器,用于ffmpeg
(寫客戶端)推流,后臺服務(wù)(讀客戶端)拉流
這里以windows系統(tǒng)作為演示,先解壓rtsp-simple-server_v0.19.1_windows_amd64.zip,打開rtsp-simple-server.exe
監(jiān)聽RTSP下TCP的8554端口,然后通過ffmpeg將指定攝像頭采集到的圖像幀向該端口進(jìn)行推流(即多個客戶端與服務(wù)器端的socket通信)
1)寫客戶端:ffmpeg
-
ffmpeg
推流視頻文件到指定ip + 端口上(-stream_loop -1
):ffmpeg -re -stream_loop -1 -i 你視頻的文件名 -c copy -f rtsp rtsp://127.0.0.1:8554/videoFile_test
-
ffmpeg
將本地攝像頭的視頻流推送到指定ip + 端口上,則需要//獲取本地攝像頭名稱 ffmpeg -list_devices true -f dshow -i dummy //ffmpeg向指定端口推流(我的是Integrated Camera) ffmpeg -f dshow -i video="自己的攝像頭驅(qū)動名稱" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/camera_test //libx264編碼 ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/camera_test
2)服務(wù)器端:RTSP服務(wù)器
-
初啟動效果如下:
-
開啟兩個
ffmpeg
模擬兩個寫客戶端,完成攝像頭采集視頻幀的推流和本地視頻文件的推流該過程會出現(xiàn)兩個
createby
和publishing
,在不同文件路徑下寫入圖像幀,可以通過指定進(jìn)程(ip+端口)來處理(這里新創(chuàng)建了56725
和56732
兩個進(jìn)程來處理),而RTSP的監(jiān)聽端口仍然是8554
,這樣可以實現(xiàn)非阻塞通信。
3)讀客戶端:讀客戶端可以通過兩種方式來實現(xiàn)
-
安裝VLC,選擇流數(shù)據(jù)播放模式,輸入
rtsp://127.0.0.1:8554/camera_test
,rtsp://127.0.0.1:8554/videoFile_test
即可播放; -
亦或者使用如下python代碼:
import cv2 def capture_video(rtsp_path): name = rtsp_path.split("/")[-1] capture = cv2.VideoCapture(rtsp_path) while capture.isOpened(): ret, frame = capture.read() if not ret: break cv2.imshow(name, frame) if cv2.waitKey(50) == 27: break if __name__ == '__main__': # rtsp_paths = ['rtsp://127.0.0.1:8554/videoFile_test','rtsp://127.0.0.1:8554/camera_test'] rtsp_paths = ['rtsp://127.0.0.1:8554/videoFile_test'] for rtsp_path in rtsp_paths: capture_video(rtsp_path) cv2.waitKey(0) cv2.destroyAllWindows()
此時會出現(xiàn)兩個createby
和reading
,即開啟兩個進(jìn)程進(jìn)行視頻流的讀取
3、存在問題:視頻讀取時延大
基于tcp
和RTP
的rtsp直播延遲很高,一開始延遲只有7s,由于TCP的擁塞控制,導(dǎo)致隨著時間推移,延遲越來越高,有14s之多。
1)可能原因1:視頻編碼導(dǎo)致延遲高(親測效果不明顯)
參考ffmpeg直播解決延時的關(guān)鍵方法,主要原因是使用libx264
或者h264
對視頻進(jìn)行編碼的問題。
解決方法參考ffmpeg–使用命令+EasyDarwin推流筆記本攝像頭
//h264_qsv編碼(比libx264編碼快點)
ffmpeg -f dshow -i video="Integrated Camera" -vcodec h264_qsv -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/camera_test
//不使用編碼器,直接推送(但是很模糊)
ffmpeg -f dshow -i video="Integrated Camera" -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/camera_test
2)可能原因2:設(shè)置ffmpeg
參數(shù)(親測效果不明顯)
參考解決ffmpeg的播放攝像頭的延時優(yōu)化問題(項目案例使用有效) _
原參數(shù):
-vcodec libx264,
-r 25,
-video_size 1280x720,
優(yōu)化參數(shù)1:
-tune zerolatency //設(shè)置零延時
-preset ultrafast //--preset的參數(shù)主要調(diào)節(jié)編碼速度和質(zhì)量的平衡,有ultrafast(轉(zhuǎn)碼速度最快,視頻往往也最模糊)、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo這10個選項,從快到慢
優(yōu)化參數(shù)2:
-threads 4,
-c:a copy,
-fflags nobuffer,
-max_delay 1,
-vprofile baseline,
-rtsp_transport tcp,
-crf 30,
-vsync 2,
-f flv
ffmpeg
完整命令如下:
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -r 25 -video_size 640x480 -tune:v zerolatency -preset:v ultrafast -threads 4 -c:a copy -fflags nobuffer -max_delay 1 -rtsp_transport tcp -crf 30 -vsync 2 -f flv -f rtsp rtsp://127.0.0.1:8554/camera_test
3)可能原因3:tcp連接導(dǎo)致延遲高
參考RTSP end to end latency will be increasing when use tcp #902
ffmpeg
在通過rtsp實現(xiàn)推流時默認(rèn)是遵循tcp協(xié)議的,目的是為了保證消息可靠傳輸。對于實時音視頻通信,如果要想實現(xiàn)低延遲,要么增加帶寬,要么使用UDP進(jìn)行傳輸。
4)原因4:逐幀讀取時需要逐幀解碼,導(dǎo)致輸入和輸出速率不匹配導(dǎo)致延遲高(有效 - 抽幀讀?。?/h5>
解決方法:對于讀客戶端,采用抽幀讀取的方法來解決。如果采用逐幀讀取并完成解碼的方式,會讓寫客戶端不停地推流,而讀客戶端來不及解碼導(dǎo)致緩存區(qū)擁塞。
參考Opencv—視頻跳幀處理,OpenCV筆記:cv2.VideoCapture 完成視頻的跳幀輸出操作
ffmpeg
寫客戶端命令無需修改:文章來源:http://www.zghlxwxcb.cn/news/detail-481237.html
//獲取本地攝像頭名稱
ffmpeg -list_devices true -f dshow -i dummy
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -r 25 -video_size 640x480 -tune:v zerolatency -preset:v ultrafast -threads 4 -c:a copy -fflags nobuffer -max_delay 1 -rtsp_transport tcp -crf 30 -vsync 2 -f flv -f rtsp rtsp://127.0.0.1:8554/camera_test
python讀客戶端代碼修改如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-481237.html
def capture_video(rtsp_path):
name = rtsp_path.split("/")[-1]
capture = cv2.VideoCapture(rtsp_path) #不用帶cv2.CAP_DSHOW
now_fps = 0
while capture.isOpened():
# 設(shè)置每 10 幀輸出一次
if (now_fps == 3):
now_fps = 0
ret, frame = capture.read()
if not ret:
break
cv2.imshow(name, frame)
if cv2.waitKey(50) == 27:
break
else:
# 跳幀,僅獲取幀但不做解碼處理
ret = capture.grab()
now_fps += 1
到了這里,關(guān)于RTSP 和 RTMP原理 & 通過ffmpeg實現(xiàn)將本地攝像頭推流到RTSP服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!