1

我希望构建一个同时进行 rtp 音频发送和接收的 gstreamer 管道。

根据我发现的示例(虽然很少),这是我几乎可以工作的代码。

(该程序是用 Rexx 编写的,但我认为发生的事情很明显。在这里,它看起来很像 bash!)。连线字符是逗号。"", 位只是为了可读性插入空行。

rtp_recv_port = 8554
rtp_send_port = 8555

 pipeline =  "gst-launch -e",
         "",
            "gstrtpbin",
            "   name=rtpbin",
         "",
            "udpsrc   port="rtp_recv_port,     -- do-timestamp=true
            '  ! "application/x-rtp,media=audio,payload=8,clock-rate=8000,encoding-name=PCMA,channels=1" ',
            "  ! rtpbin.recv_rtp_sink_0",
         "",
            "rtpbin. ",
            "  ! rtppcmadepay",
            "  ! decodebin         ",
            '  ! "audio/x-raw-int, width=16, depth=16, rate=8000, channels=1" ',
            "  ! volume volume=5.0 ",
            "  ! autoaudiosink sync=false",
         "",
            "autoaudiosrc          ",
            "  ! audioconvert      ",
            '  ! "audio/x-raw-int,width=16,depth=16,rate=8000,channels=1" ',
            "  ! alawenc           ",
            "  ! rtppcmapay perfect-rtptime=true mtu=2000",
            "  ! rtpbin.send_rtp_sink_1",
         "",
            "rtpbin.send_rtp_src_1 ",
            "  ! audioconvert",
            "  ! audioresample",
            "  ! udpsink port="rtp_send_port "host="ipaddr

pipeline "> pipe.out"

如果我注释掉之后的行

"  ! autoaudiosink sync=false",

仅接收部分工作得很好。但是,如果我将这些行留在原处,我会收到此错误:

ERROR: from element /GstPipeline:pipeline0/GstUDPSrc:udpsrc0: Internal data flow error.
Additional debug info:
gstbasesrc.c(2582): gst_base_src_loop (): /GstPipeline:pipeline0/GstUDPSrc:udpsrc0:
streaming task paused, reason not-linked (-1)

那么,什么突然变得没有联系了?我会理解错误是否在 autoaudiosrc 部分,但突然出现在 udpsrc 部分?

帮助的建议,有人吗?

(FWIW)在我完成这部分工作后,我将返回并添加 rtcp 部分或管道。

4

1 回答 1

2

这是一个将发送和接收音频(全双工)的管道。我手动设置了源,使其可扩展(你也可以在上面放视频,如果你想两者都做,我有一个示例管道供你使用)。我将其设置为jitter buffer modeBUFFER因为我的网络是在具有大量抖动的网络上实现的。现在,在这个示例管道中,您可以添加所有变量更改(volume、您的音频源、编码和解码等)。

 sudo gst-launch gstrtpbin \ 

 name=rtpbin audiotestsrc ! queue ! audioconvert ! alawenc ! \ 

 rtppcmapay pt=8 ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! \ 
 multiudpsink clients="127.0.0.1:5002" sync=false async=false \ 

 udpsrc port=5004 caps="application/x-rtp, media=audio, payload=8, clock-rate=8000, \ 
 encoding-name=PCMA" ! queue ! rtpbin.recv_rtp_sink_0  \ 
 rtpbin. buffer-mode=RTP_JITTER_BUFFER_MODE_BUFFER ! rtppcmadepay ! alawdec ! alsasink

我遇到了控制(RTCP)数据包的问题。我发现如果您使用 RTCP,环回测试是不够的。您将不得不在两台相互交谈的计算机上进行测试。

让我知道这是否适合您,因为我已经在 4 台不同的机器上进行了测试,并且都可以正常工作。

于 2013-03-01T15:39:21.113 回答