![](/img/trans.png)
[英]OpenCV VideoCapture says video has 0 frames (C++ and Python)
[英]Grey Video frames when using OpenCV Videocapture with GStreamer C++
嘿,我是 Gstreamer 的新手,想通過 a.network 將從攝像機捕獲並使用 OpenCV 處理的視頻發送到接收部分。 然后接收部分讀取它並顯示它。 這應實時完成。 它基本上適用於下面的代碼/gstreamer 設置,但是一旦幀丟失(至少我認為這是原因),視頻就會以灰色部分的形式損壞(附圖)。
OpenCV 發送部分:
cv::VideoWriter videoTransmitter("appsrc ! videoconvert ! videoscale ! x264enc ! rtph264pay config-interval=1 pt=96 ! udpsink host=192.168.168.99 port=5000", cv::VideoWriter::fourcc('H', '2', '6', '4'), 10, videoTransmitter_imageSize, true);
OpenCV 接收部分:
cv::VideoCapture videoReceiver("udpsrc port=5000 ! application/x-rtp ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! videoconvert ! appsink", cv::CAP_GSTREAMER);
它基本上可以工作,但我經常在視頻中看到灰色部分,然后停留一段時間直到視頻正確顯示。 我猜它總是在由於傳輸而丟失幀時發生。 但是,我怎樣才能擺脫這些灰色/損壞的框架? 任何提示? 我需要設置任何 Gstreamer 參數來調整結果嗎? 有沒有更好的方法來 stream 與 opencv over.network 的視頻?
任何幫助表示贊賞!
不,Gstreamer 中沒有任何機制來檢測損壞的幀,因為這沒有意義。
在大多數現代視頻編解碼器中,幀不再完整發送,而是分成幾片(意味着只有幀的一小部分)。 它可以采用多個內部數據包(每個數據包包含多個切片)來構建一個完整的幀,這是一件好事,因為它使您的 stream 對錯誤更具彈性,並允許對切片進行多線程解碼(例如)。
為了實現你想要的,你有多種解決方案:
GOP - 1
幀來恢復(你必須解碼它們,但你不能使用它們,它們可能已損壞),你需要一種檢測錯誤的方法,請參見上面的第 1 點或第 2 點. 對於x264enc
,該參數稱為key-int-max
。 您可能還想嘗試intra-refresh=true
,這樣錯誤時的破幀效果會更短。 缺點是相同視頻質量的帶寬增加。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.