Gstreamer의 rtpbin 예제가 작동하지 않는 이유는 무엇입니까?

Gstreamer의 rtpbin 예제가 작동하지 않는 이유는 무엇입니까?

나는 달리려고 노력하고있다.rtpbin 예GStream 1.18.5가 포함된 Ubuntu 21.10 VirtualBox VM.

C 코드에서 모든 작업을 수행하는 것이 간단해 보이지만 rtpbin예제 gst-launch-1.0에서는 (기본 튜토리얼 중 하나).

rtpbin처음에는 예제가 작동 하지 못했습니다 .

  • ffenc_h263ffdec_h263( WARNING: erroneous pipeline: no element "ffenc_h263")이므로 각각 avenc_h263및로 대체했습니다.avdec_h263
  • v4l2src에서 사용할 수 없는 장치를 찾고 있어서 /dev으로 전환했습니다 videotestsrc.

이러한 대체 항목이 문제가 아닌지 확인하기 위해 RTSP 및 UDP 항목을 제거하고 다음을 실행하여 확인했습니다.

gst-launch-1.0 videotestsrc ! videoconvert ! avenc_h263 ! rtph263pay \ 
    ! rtph263depay ! avdec_h263 ! xvimagesink

그리고 "바" 비디오를 봤어요. 나도 도망쳤어

gst-launch-1.0 audiotestsrc ! amrnbenc ! rtpamrpay ! rtpamrdepay ! amrnbdec ! alsasink

짜증나는 테스트 톤을 들어보세요. 이를 토대로 볼 때 문제는 UDP와 RTSP에 있다고 생각됩니다.

달리기

 gst-launch-1.0 rtpbin name=rtpbin \
         videotestsrc ! videoconvert ! avenc_h263 ! rtph263pay ! rtpbin.send_rtp_sink_0 \
                   rtpbin.send_rtp_src_0 ! udpsink port=5000                            \
                   rtpbin.send_rtcp_src_0 ! udpsink port=5001 sync=false async=false    \
                   udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
         audiotestsrc ! amrnbenc ! rtpamrpay ! rtpbin.send_rtp_sink_1                   \
                   rtpbin.send_rtp_src_1 ! udpsink port=5002                            \
                   rtpbin.send_rtcp_src_1 ! udpsink port=5003 sync=false async=false    \
                   udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

프로그램

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
0:00:59.0 / 99:99:99 # This is counting up

그런 다음 다른 창에서 나는 실행합니다.

gst-launch-1.0 rtpbin name=rtpbin                                          \
     udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1996" \
             port=5000 ! rtpbin.recv_rtp_sink_0                                \
         rtpbin. ! rtph263depay ! avdec_h263 ! xvimagesink                    \
      udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
      rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
     udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1" \
             port=5002 ! rtpbin.recv_rtp_sink_1                                \
         rtpbin. ! rtpamrdepay ! amrnbdec ! alsasink                           \
      udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
      rtpbin.send_rtcp_src_1 ! udpsink port=5007 sync=false async=false

그리고 봐라

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock

일부 UDP 포트(5000, 5001, 5002, 5003, 5005 및 5007)가 열려 있을 것으로 예상했습니다. 물론, 실행중인 netstat쇼는 다음과 같습니다.

rtsp@rtsp-VirtualBox:~$ sudo netstat -apn | grep -w 500[0-9]
udp        0      0 0.0.0.0:5000            0.0.0.0:*                           7076/gst-launch-1.0 
udp        0      0 0.0.0.0:5001            0.0.0.0:*                           7076/gst-launch-1.0 
udp        0      0 0.0.0.0:5002            0.0.0.0:*                           7076/gst-launch-1.0 
udp        0      0 0.0.0.0:5003            0.0.0.0:*                           7076/gst-launch-1.0 
udp        0      0 0.0.0.0:5005            0.0.0.0:*                           6862/gst-launch-1.0 
udp        0      0 0.0.0.0:5007            0.0.0.0:*                           6862/gst-launch-1.0 

모든 포트가 제대로 작동하는지 확인하세요.

  • rtsp-test-server스냅과 VLC에서 설치했습니다 .
  • 제공된 포트를 통해 비디오를 스트리밍할 수 있습니다 rtsp-test-server. UDP 대신 TCP 포트를 사용하기 때문에 완벽한 테스트는 아닌 것 같지만, 테스트하기가 쉽기 때문에 한번 시도해 보았습니다.

그러나 나는 어떤 영상도 보지 못했고 어떤 소리도 듣지 못했습니다. 누군가 내 실수를 지적할 수 있나요?

답변1

질문을 제출할 준비가 거의 다 되어서 다시 인터넷 검색을 했습니다. 내가 찾은이 튜토리얼udpsrc및 요소 에 추가된 몇 가지 추가 플래그를 보여줍니다 udpsink. 다음 플래그를 추가하면 예제가 작동하여 RTSP를 통해 비디오를 보고 사운드를 들을 수 있습니다.

  • host=127.0.0.1모든 udpsink요소 에
  • address=127.0.0.1모든 udpsource요소 에

해당 튜토리얼에 남겨둔 다른 플래그는 기본값일 수 있다고 생각합니다.

관련 정보