GStreamer中AppSrc的简单使用(续)

文章《GStreamer中AppSrc的简单使用》介绍了AppSrc的初步使用,但对于各种复杂的媒体格式,需要自动解析媒体内容,自动生成Pipeline,这需要借助Decodebin来完成。Decodebin是Playbin的后端组件,它支持对输入进来的数据类型进行自动探测并设置解码器。对于任意一路解码后的媒体流(audio或video),它都会emit一个”pad-added”信号,可以基于这个信号增加相应的sink组件。 
针对AppSrc,上篇文章的代码可演化为(仅Audio):

 19 #include <stdio.h>
 20 #include <stdlib.h>
 21 #include <gst/gst.h>
 22 #include <gst/app/gstappsrc.h>
 23
 24 static FILE * fp;
 25 static GstPad * audioPad;
 26
 27 void _needData( GstAppSrc * src, guint arg1, gpointer user_data )
 28 {
 29     GstBuffer * _buf;
 30     GstFlowReturn _ret;
 31     int _size;
 32
 33     _buf    =   gst_buffer_new_and_alloc( arg1 );
 34
 35     GST_BUFFER_OFFSET( _buf )   =   ftell( fp );
 36
 37     _size   =   fread( GST_BUFFER_DATA( _buf ), 1, arg1, fp );
 38
 39     GST_BUFFER_SIZE( _buf ) =   _size;
 40
 41     if( feof( fp ))
 42     {
 43         g_message( "rewind to head" );
 44         fseek( fp, 0, SEEK_SET );
 45     }
 46
 47     g_signal_emit_by_name( src, "push-buffer", _buf, &_ret );
 48
 49     gst_buffer_unref( _buf );
 50 }
 51
 52 void _enoughData( GstElement * src, gpointer user_data )
 53 {
 54     g_message( "%s", __func__ );
 55 }
 57 /*
 58  * ===  FUNCTION  ======================================================================
 59  *         Name:  _decNewPad
 60  *  Description:
 61  * =====================================================================================
 62  */
 63 static void _decNewPad( GstElement * decodebin, GstPad * pad, gpointer user_data )
 64 {
 65     g_message( "%s", __func__ );
 66     gst_pad_link( pad, audioPad );
 67 }       /* -----  end of static function _decNewPad  ----- */
 68
 69 /*
 70  * ===  FUNCTION  ======================================================================
 71  *         Name:  main
 72  *  Description:
 73  * =====================================================================================
 74  */
 75 int main ( int argc, char *argv[] )
 76 {
 77     GstElement * _pipeline, * _src, * _codec, * _sink;
 78
 79     fp  =   fopen( argv[1], "r" );
 80
 81     g_assert( fp != NULL );
 82
 83     gst_init( &argc, &argv );
 84
 85     g_assert( _src  =   gst_element_factory_make( "appsrc", "source" ));
 86
 87     g_assert( _codec    =   gst_element_factory_make( "decodebin", "codec" ));
 88     g_signal_connect( _codec, "pad-added", G_CALLBACK( _decNewPad ), NULL );
 89
 90     g_assert( _sink =   gst_element_factory_make( "alsasink", "sink" ));
 91     g_assert( audioPad  =   gst_element_get_static_pad( _sink, "sink" ));
 92
 93     _pipeline   =   gst_pipeline_new( "pipeline" );
 94
 95     gst_bin_add_many( GST_BIN( _pipeline ), _src, _codec, _sink, NULL );
 96
 97     gst_element_link_many( _src, _codec, NULL );
 98
 99     g_signal_connect ( _src, "need-data", G_CALLBACK( _needData ), NULL );

100     g_signal_connect ( _src, "enough-data", G_CALLBACK( _enoughData ), NULL );
101
102     gst_element_set_state( _pipeline, GST_STATE_PLAYING );
103
104     pause();
105
106     return 0;
107 }               /* ----------  end of function main  ---------- */

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值