Gstreamer-音频数据播放之AAC

下述代码使用场景:

需要在当前设备端播放,AAC编码格式的音频数据

// push buffer to appsrc
bool push_data(const char *data, int data_size)
{
    GstBuffer *buffer = gst_buffer_new_allocate(NULL, data_size, NULL);

    GstMapInfo map;

    gst_buffer_map(buffer, &map, GST_MAP_WRITE);
    memcpy((guchar *)map.data, data, gst_buffer_get_size(buffer));

    GstFlowReturn ret;
    if(m_app_src){
        g_signal_emit_by_name(m_app_src, "push-buffer", buffer, &ret);
    }
    gst_buffer_unmap(buffer, &map);
    gst_buffer_unref(buffer);
    if (ret != GST_FLOW_OK) {
        g_printerr("[init], push_data fail ret: %d.\n", ret);
        return false;
    }

    return true;
}

// 初始化 pipeline
//  |-------------------------------pipeline-----------------------------|
//  | appsrc->aacparse->faad->audioconvert->audioresample->autoaudiosink |
//  |--------------------------------------------------------------------|
bool init(int sample_rate, int channel, const char *formate)
{
    m_app_src = gst_element_factory_make("appsrc", "app_src");
    if (!m_app_src) {
        g_printerr("[init], failed to create a appsrc.\n");
        return false;
    }

    m_aac_parse = gst_element_factory_make("aacparse", "aac_parse");
    if (!m_aac_parse) {
        g_printerr("[init], failed to create a aacparse.\n");
        return false;
    }
    m_caps_filter = gst_element_factory_make("capsfilter", "caps_filter");
    if (!m_caps_filter) {
        g_printerr("[openDevice], caps_filter elements could be created.\n");
        return false;
    }
    GstCaps *caps = gst_caps_new_simple("audio/mpeg", "format", G_TYPE_STRING, formate, "rate", G_TYPE_INT, sample_rate,
                                        "channels", G_TYPE_INT, channel, nullptr);
    if (!caps) {
        g_printerr("[openDevice], caps new fail.\n");
        return false;
    }
    g_object_set(G_OBJECT(m_caps_filter), "caps", caps, nullptr);
    gst_caps_unref(caps);

    m_faad = gst_element_factory_make("faad", "aac_dec");
    if (!m_faad) {
        g_printerr("[init], failed to create a faad.\n");
        return false;
    }

    m_audio_convert = gst_element_factory_make("audioconvert", "audio_convert");
    if (!m_audio_convert) {
        g_printerr("[init], failed to create a audioconvert.\n");
        return false;
    }

    m_audio_resample = gst_element_factory_make("audioresample", "audio_resample");
    if (!m_audio_resample) {
        g_printerr("[init], failed to create a audioconvert.\n");
        return false;
    }

    m_auto_audio_sink = gst_element_factory_make("autoaudiosink", "auto_audio_sink");
    if (!m_auto_audio_sink) {
        g_printerr("[init], failed to create a autoaudiosink.\n");
        return false;
    }
    // 网络传输存在丢包 时钟同步置为false
    g_object_set(G_OBJECT(m_auto_audio_sink), "sync", false, nullptr);

    m_pipeline = gst_pipeline_new("pipeline");
    if (!m_pipeline) {
        g_printerr("[init], failed to create a pipeline.\n");
        return false;
    }

    gst_bin_add_many(GST_BIN(m_pipeline), m_app_src, m_aac_parse, m_caps_filter, m_faad, m_auto_audio_sink, NULL);

    if (gst_element_link_many(m_app_src, m_aac_parse, m_caps_filter, m_faad, m_auto_audio_sink, NULL) != TRUE) {
        g_printerr("[init], gst_element_link_filtered fail.\n");
        return false;
    }

    if (gst_element_set_state(m_pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
        g_printerr("[init], play audioplayer fail.\n");
        return false;
    }

    g_printerr("[init], init audioplayer successfully.\n");
    m_isPlaying = true;
    return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值