最近一段時間在研究傳屏低延遲傳輸相關的一些東西。本來想使用gstreamer來驗證下rtp over udp傳送h264 nal數據相關
的,結果發現竟然不能用playbin來播放rtp的數據!誠然,這也有其原因,因為rtp需要一些帶外數據,這是不能簡單通過流
來檢查的,然而也沒有手段簡單傳入sdp給playbin,讓其正常工作。沒有辦法,在gstreamer-devel和https://bugzilla.gnome.org
bug管理平台上搜了一圈,有人碰到類似的問題,但是沒有完整的解決方案,於是完善了rtpsrc的插件,可以支持類似下面的播放:
gst-launch-1.0 playbin uri="rtp://10.9.44.117:5000?media=video&clock-rate=90000&encoding-name=H264&payload=96&do-retransmission=true&latency-ms=50&rtp-profile=1&rtx-host=192.168.31.141&rtx-port=5006"
這樣子感覺方便了不少,直接可以通過uri 查詢參數把配置信息傳遞給udpsrc ,構造caps參數,對,沒錯,新插件rtpsrc的作用
就是起一個橋梁作用,本質還是利用udpsrc和rtpbin一起能協同工作,構造后大致的pipeline類似下面這樣:
// RTP receiver (example) // receives h264 encoded RTP video on port 5000, RTCP is received on port 5001. // the receiver RTCP reports are sent to port 5005 //-----------------------RtpSrc------------- //| .-------. .----------. | .---------. .-------. .-----------. //| RTP |udpsrc | | rtpbin | | |h264depay| |h264dec| |xvimagesink| //| port=5000 | src->recv_rtp recv_rtp->sink src->sink src->sink | //| '-------' | | | '---------' '-------' '-----------' //| | | |------------------------- //| | | .-------. | //| | | |udpsink| RTCP | //| | send_rtcp->sink | port=5005 | //| .-------. | | '-------' sync=false | //| RTCP |udpsrc | | | async=false| //| port=5001 | src->recv_rtcp | | //| '-------' '----------' | //------------------------------------------------------------------|
代碼已經以補丁的形式,提交到了bugzilla,能不能被合並,或者什么時候被合並進主分支,我不太清楚,但是它至少是可以正常工作的,
有這方面需求的同仁,可以移步這里:https://bugzilla.gnome.org/show_bug.cgi?id=703111 ,去合並進入自己的gstreamer sdk中,
應該能使您的生活更輕松一些。