gstreamer中的好东西,appsink和appsrc
2010-09-27 16:11
253 查看
转载时请注明出处和作者联系方式
文章出处: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上多媒体开发的王者!
前面我只贴了一点代码片段,如果有感兴趣的朋友,可以给我留言或邮件联系。
文章出处: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上多媒体开发的王者!
前面我只贴了一点代码片段,如果有感兴趣的朋友,可以给我留言或邮件联系。
相关文章推荐
- gstreamer学习笔记:分享几个appsink和appsrc的example
- 终于找到你了gstreamer appsink
- gstreamer --从appsrc 到 rtmpsink推流
- Gstreamer 测试udpsink udpsrc播放mp3文件
- gstreamer如何查看相关插件信息(src/sink)?
- J哥---------分享好东西:android抓包工具fiddler使用介绍 抓取 手机APP 中资源。
- Google App Engine是个好东西
- 【GStreamer开发】GStreamer播放教程07——自定义playbin2的sink
- gstreamer插件开发 - sink插件开发
- 校园助手APP--昨天看代码发现了一个好东西——UncaughtExceptionHandler
- 揭秘APP软件开发者百万富翁之路:造程序的工厂(好东西)
- gstreamer插件开发 - sink插件开发
- 使用 GStreamer appsrc 等插件实现视频音频混流,录制和推流
- GStreamer中AppSrc的简单使用(续)
- Gstreamer/Plugin-base/audiosink: AlsaSink AlsaSrc 结构解析
- gstreamer -- appsrc 到 rtsp推流
- GStreamer的AppSrc的简单使用
- GStreamer App开发 (一)
- GStreamer的AppSrc的使用(续2)
- GStreamer App开发 (二) HTML5 & GStreamer 简单说明