2014-08-27 91 views
1

我想通過udpsink流從計算機A到計算機B的攝像頭飼料。如果在計算機B通過udpsrc啓動其接收管道之前,計算機A的管道將數據發送到計算機B,則不會使用vaapisink,xvimagesink或ximagesink顯示數據。如果計算機B在任何數據流式傳輸之前啓動他的管道,我可以很好地顯示計算機A的視頻輸入。Gstreamer 1.0沒有視頻當udpsink管道運行之前udpsrc管道

下面是我在命令行使用管道: 計算機A:

sudo gst-launch-1.0 -v v4l2src device=/dev/video0 do-timestamp=true ! \ 
"video/x-raw, format=I420, width=640, height=480, framerate=30/1" ! \ 
vaapiencode_h264 ! rtph264pay ! udpsink host=192.168.0.31 port=5400 

計算機B:

sudo gst-launch-1.0 -v udpsrc port=5400 ! "application/x-rtp, payload=96, \ 
encoding-name=H264" ! rtph264depay ! vaapiparse_h264 ! vaapidecode ! \ 
videoconvert ! xvimagesink sync=false async=false 

當我使用GST_DEBUG = 4在計算機B,我認爲沒有錯誤。我通過調試輸出看到的是,當計算機B在A之前啓動他的管道時,計算機B從gst_event_new_caps接收到一個新的GST_EVENT,然後處理計算機A的流。但是如果計算機A的流已經流入計算機B而沒有初始化B的管道,那麼這個事件永遠不會被提升。

回答

1

分辨率: 添加「配置間隔= 1」(我敢肯定,其他區間的量就可以了 - 什麼,但0)在計算機A的管道「rtph264pay」閱讀:

sudo gst-launch-1.0 -v v4l2src device=/dev/video0 do-timestamp=true ! \ 
"video/x-raw, format=I420, width=640, height=480, framerate=30/1" ! \ 
vaapiencode_h264 ! rtph264pay config-interval=1 ! udpsink host=192.168.0.31 port=5400 

這裏的通過將GST_DEBUG = 4添加到計算機A和B中,我發現了這一點。

當計算機A啓動其管道時,似乎只會默認調用一次新的GST_EVENT。如果計算機B沒有運行它的管道,在UDP端口上偵聽數據,它將不會檢測到任何告訴計算機B要設置的上限的新GST_EVENT。

這解釋了爲什麼如果計算機B的管道在計算機A之前運行,這些管道工作的原因;計算機B將捕獲計算機A的GST_EVENT告訴計算機B要設置的大小類型。

將config-interval設置爲大於0的值時,計算機A的流可以連續地提高GST_EVENT,讓計算機B停止/啓動他的管道並立即知道要設置哪些上限。