gstreamer中的好东西,appsink和appsrc

转载时请注明出处和作者联系方式
文章出处:http://blog.csdn.net/jack0106
作者联系方式:冯牮 fengjian0106@yahoo.com.cn

 

     之前开发过一个小程序,就是用gstreamer做了一个简单的IP电话,就是建立了两个pipeline,代码片段分别如下:

 

speaker
            = "gstrtpbin name=rtpbin "
                "pulsesrc ! audioconvert ! audioresample ! mulawenc ! rtppcmupay ! rtpbin.send_rtp_sink_0 "
                "rtpbin.send_rtp_src_0 ! udpsink name=speaker_udpsink "
                "rtpbin.send_rtcp_src_0 ! udpsink name=speaker_udpsinkrtcp sync=false async=false "
                "udpsrc name=speaker_udpsrc ! rtpbin.recv_rtcp_sink_0";

 

listener
            = "gstrtpbin name=rtpbin "
                "udpsrc name=listener_udpsrcrtp caps=/"application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCMA/" ! rtpbin.recv_rtp_sink_0 "
                "rtpbin. ! rtppcmudepay ! mulawdec ! audioconvert ! audioresample ! pulsesink "
                "udpsrc name=listener_udpsrcrtcp  ! rtpbin.recv_rtcp_sink_0 "
                "rtpbin.send_rtcp_src_0 ! udpsink name=listener_udpsink sync=false async=false";

 

      在局域网中测试的时候,没有啥问题,但是和sip协商过程联合测试的时候,就出了点问题,原因两三句话不太好描述,反正解决的办法,就是要让上面代码片段中红色的udpsink和udpsrc使用同一个socket描述符。

 

     本来,udpsink和udpsrc,都分别有一个属性,就是用来设置自定义的socket描述符的,但是,当我用同一个socket描述符同时设置这两个插件的时候,运行的效果和想象的并不一样,调试了半天,分析出的结果是udpsink和udpsrc虽然可以设置socket,但是,并不能同时使用同一个socket。

 

     后来,找到一个解决办法,就是使用appsink,把第一个pipeline改成如下形式

 

speaker
            = "gstrtpbin name=rtpbin "
                "pulsesrc ! audioconvert ! audioresample ! mulawenc ! rtppcmupay ! rtpbin.send_rtp_sink_0 "
                "rtpbin.send_rtp_src_0 ! appsink name=appsink "
                "rtpbin.send_rtcp_src_0 ! udpsink name=speaker_udpsinkrtcp sync=false async=false "
                "udpsrc name=speaker_udpsrc ! rtpbin.recv_rtcp_sink_0";

 

    手动创建一个socket,设置到前面给出的红色的udpsrc上,同时,在appsink的信号处理函数中,再直接调用send函数,往同一个socket上发送数据,这样问题就解决了,而且socket本身就是全双工工作的,连线程同步都不要考虑了。

 

 

    自己动手写gstreamer插件,是一件比较困难的事情,目前我还没有那个能力,不过还好发现了appsink和appsrc,可以在一定程度上避免编写gstreamer插件,同时又可以在pipeline中调用第三方的代码。gstreamer的确是linux上多媒体开发的王者!

 

    前面我只贴了一点代码片段,如果有感兴趣的朋友,可以给我留言或邮件联系。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 是的,可以使用GStreamer的IPC插件来实现在不同进程之间传输数据。其appsrcappsinkGStreamer的元素,可以使用管道(pipeline)将它们连接到不同的进程。在发送端进程,使用appsrc元素来发送数据到管道,然后使用IPC插件将数据传输到接收端进程appsink元素。在接收端进程appsink元素接收数据并进行处理。这样,就可以实现跨进程的数据传输。 ### 回答2: appsrcappsink是基于GStreamer框架的元素,用于在不同的媒体流之间进行数据传输。在GStreamer,元素之间的数据传输通常通过插件(例如队列元素)在同一进程完成。 然而,根据GStreamer官方文档的说明,appsrcappsink并不能直接在不同的进程之间进行数据传输。这是因为它们是通过GStreamer在同一进程的内部进行通信的。 如果需要在不同进程之间实现数据传输的话,可以采用不同的方法。其一种方法是使用gstreamer的interprocess(跨进程)插件,例如shmsink和shmsrc。这些插件可以通过共享内存实现跨进程的数据传输。 另外,还可以使用网络传输,比如TCP/IP或UDP协议,在不同的进程之间进行数据传输。在这种情况下,需要一个进程作为数据发送方,将数据编码并通过网络发送;另一个进程作为数据接收方,接收并解码数据。 综上所述,虽然appsrcappsink不能直接在不同进程之间进行数据传输,但可以通过使用适当的插件或网络传输方式来实现跨进程的数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值