GStreamerのAppSrcの簡単な使用


AppSrcの使用について簡単に説明します.GStreamerバージョン0.10.35.アプリケーションは様々な方法でPipelineにデータを注入することができ、AppSrcを使用するのが最も簡単です.AppSrcは、PullモードとPushモードの2つのモードで動作することができる.Pullモードでは、AppSrcは必要に応じてアプリケーションにデータ(信号:need-data)を要求し、PushモードではアプリケーションがAppSrcにデータ(信号:enough-data)をアクティブに注入します.AppSrcにデータを注入するには、GStreamer用のBufferオブジェクトが必要です.データがGstBufferにコピーされた後、信号:push-bufferを介してAppSrcに渡されます.次に、最も簡単なPullモードのAppSrcの使用例を実装し、mp 3ファイルを再生します.
#include 
#include 
#include 
#include 

static FILE * fp;

void _needData( GstAppSrc * src, guint arg1, gpointer user_data )
{
    GstBuffer * _buf;
    GstFlowReturn * _ret;
    int _size;

    _buf    =   gst_buffer_new_and_alloc( arg1 );

    _size   =   fread( GST_BUFFER_DATA( _buf ), 1, arg1, fp );

    if( _size < arg1 )//      ,    
    {
        fseek( fp, 0, SEEK_SET );

        fread( GST_BUFFER_DATA( _buf ) + _size, 1, arg1 - _size, fp );
    }

    g_signal_emit_by_name( src, "push-buffer", _buf, &_ret );//    pipeline

    gst_buffer_unref( _buf );
}

void _enoughData( GstElement * src, gpointer user_data )
{
    g_message( "%s", __func__ );
}
/*
 * ===  FUNCTION  ======================================================================
 *         Name:  main
 *  Description:
 * =====================================================================================
 */
int main ( int argc, char *argv[] )
{
    GstElement * _pipeline, * _src, * _codec, * _sink;

    fp  =   fopen( "/root/2.mp3", "r" );

    g_assert( fp != NULL );

    gst_init( &argc, &argv );

    g_assert( _src  =   gst_element_factory_make( "appsrc", "source" ));
    g_assert( _codec    =   gst_element_factory_make( "mad", "codec" ));//mad mp3 decoder
    g_assert( _sink =   gst_element_factory_make( "alsasink", "sink" ));

    _pipeline   =   gst_pipeline_new( "pipeline" );

    gst_bin_add_many( GST_BIN( _pipeline ), _src, _codec, _sink, NULL );

    gst_element_link_many( _src, _codec, _sink, NULL );

    g_signal_connect ( _src, "need-data", G_CALLBACK( _needData ), NULL );

    gst_element_set_state( _pipeline, GST_STATE_PLAYING );

    pause();

    return 0;
}               /* ----------  end of function main  ---------- */