處理即時 RTSP 串流
| 欄位 | 值 |
|---|---|
| 類別 | 相機與串流 |
| 難度 | 中級 |
| 預估閱讀時間 | 5-10 minutes |
| 標籤 | rtsp, h264, h265, streaming, input-group, live-input |
這是第一個章節,其中輸入來自程式外部。在之前的章節中,我們會產生測試圖像或從磁碟讀取檔案;在這裡,影格會從網路串流中持續不斷地傳入,而您會以盡可能快的速度處理它們。這個機制是一個可重複使用的 Graph 程式碼片段,即 RtspDecodedInput,它將整個 RTSP 到原始影格的前端整合到單一介面中。
本章刻意停留在「提取已解碼的影格」這個步驟。將它們輸入到 Model 中,會在其他地方進行說明(001 適用於單次模型執行,007 適用於將模型插入到管線中,015 適用於將模型嵌入到圖中)。到本章結束時,您將連接到一個 RTSP URL,並列印每個已解碼影格的張量形狀——這證明了串流正在進行。
這僅僅是一個消費者。要發布一個串流,請執行一個獨立的 RTSP 伺服器(例如 mediamtx),並將 --url 指向它。
操作指南
設定 RTSP 使用者端
RtspDecodedInputOptions 設定來源和解碼器。url 選擇
rtsp://... 來源。codec 選擇編碼格式。H.264 是預設值;
本教學還接受 avc、h265 和 hevc,其中 AVC 等於 H.264,而 HEVC 等於 H.265。
當您已經知道來源的影格速率時,請設定 source_fps。如果您省略它,此
教學將使用 OpenCV 開啟 RTSP 來源,讀取其報告的 FPS,並將
檢測到的值提供給 RtspDecodedInput。該群組本身不會探測
URL。只有探測路徑需要 OpenCV,並且 Python 版本會在
需要時導入它,因此提供 --source-fps 時,無需使用它;要進行探測 ,請使用
pip install opencv-python 安裝它。對於 H.265,Neat 將此值傳播到
已剖析的串流功能和解碼器設定中。它不會更改影格速率。
H.265 串流必須使用 HEVC Main 設定檔、8 位元、4:2:0 輸入。
設定 tcp = true 會透過 TCP 傳輸 RTP。TCP 可以保留順序並重新傳輸
遺失的片段,與 UDP 相比,這可以減少可見的遺失,但可能會增加
恢復遺失資料時的延遲。
// Configure the URL, codec, source cadence, and RTSP transport.
simaai::neat::nodes::groups::RtspDecodedInputOptions rtsp_opt;
rtsp_opt.url = url;
rtsp_opt.codec = parse_codec(codec_name);
rtsp_opt.source_fps = source_fps;
rtsp_opt.tcp = true;
組合圖
建立一個 Graph 僅有兩個階段: RtspDecodedInput 片段(來源)和一個簡單的 Output 節點(拉取端點)。新增此片段是一個單一 add(...) —它會在內部擴展到連接/解封包/解碼元件,因此您的設定會維持在預期層級。由於輸入源自管線的內部,因此我們稱之為 build(RunOptions{}) 過載,且無需採樣:沒有可用的框架。 build() 一開始就提供,因為串流會產生這些資料。
// Build a Graph whose only stages are the RTSP group and an Output node.
simaai::neat::Graph graph;
graph.add(simaai::neat::nodes::groups::RtspDecodedInput(rtsp_opt));
graph.add(simaai::neat::nodes::Output());
auto run = graph.build(simaai::neat::RunOptions{});