Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gstreamer gstrtpbin发送器/接收器位于同一管道中_Gstreamer_Rtp - Fatal编程技术网

gstreamer gstrtpbin发送器/接收器位于同一管道中

gstreamer gstrtpbin发送器/接收器位于同一管道中,gstreamer,rtp,Gstreamer,Rtp,我希望构建一个单一的gstreamer管道,它同时进行rtp音频发送和接收 根据我发现的示例(虽然很少),下面是我几乎可以工作的代码 (这个程序是用Rexx编写的,但我认为,很明显发生了什么。在这里,它看起来很像bash!)。行链字符是逗号。“”位只是插入空行以便于阅读 rtp_recv_port = 8554 rtp_send_port = 8555 pipeline = "gst-launch -e", "", "gstrtpbin",

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

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

(这个程序是用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部分或管道。

这里是一个发送和接收音频(全双工)的管道。我手动设置源,使其可扩展(您也可以将视频放在上面,如果您想同时执行这两项操作,我为您提供了一个示例管道)。我将
jitterbuffermode
设置为
buffer
,因为我的模式是在一个有大量抖动的网络上实现的。现在,在这个示例管道中,您可以添加所有变量更改(
音量、音频源、编码和解码等)

我的控制(RTCP)数据包有问题。我发现,如果您正在使用RTCP,则回环测试是不够的。你必须在两台计算机上进行测试


让我知道这是否适用于您,因为我已经在4台不同的机器上进行了测试,所有这些机器都工作正常

事实上我和韦斯在同一条船上。除了我的,必须是两台linux机器在视频通话中相互发送音频和视频的实时流。一旦我弄明白了我的想法,我相信如果到那时还没有答案的话,我会明白的。好吧,不孤独是很好的。提前感谢您的帮助。我最终给出了pup,并将接收器和发送器管道放在不同的线程中。很好,是的!在我计算出一边必须是5002/5004,另一边必须是5004/5002之后,这一切都很好。花了一两分钟的时间来调整它的大小(没有alsa,使用autoaudiosink)。在一台主机上的两个虚拟机(一个Linux和一个Windows)之间尝试了它(Mac很奇怪!)。他们共用同一个扬声器,所以输出的声音很像快速莫尔斯。做得好。我还没有为RTCP烦恼太多,因为到目前为止,我还不必担心抖动或延迟缓解和操作(概念验证和未完全实现)。然而,我使用过的每一个实例,RTCP都不会在环回中真正工作。记住,src和接收器都将发送和接收RTCP数据。因此,在这种情况下,它与普通的旧RTP流略有不同。
 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