Gstreamer. Разный размер выборки при потоковой передаче с микрофона и файла .ogg

#audio #gstreamer #ogg

Вопрос:

Я хочу передавать аудиоданные с микрофона и из какого-либо аудиофайла ogg в свое приложение. Есть трубопроводы:

с микрофона:

 directsoundsrc device="{1b70206d-3bb5-4246-a4b3-6aeddb8f1264}" 
! audioconvert 
! audio/x-raw, format=(string)F32LE, rate=(int)48000, channels=(int)2, layout=(string)interleaved 
! appsink sync=true
 

из файла:

 filesrc location=sound_file.ogg ! oggdemux ! vorbisdec 
! audioconvert ! audio/x-raw, format=(string)F32LE, channels=(int)2, layout=(string)interleaved 
! audioresample ! audio/x-raw, format=(string)F32LE, rate=(int)48000, channels=(int)2, layout(string)interleaved 
! appsink sync=true
 

Вот как я читаю буфер из потока:

 GstSample* gs = gst_app_sink_pull_sample(GST_APP_SINK( m_appsink));
    if (gs)
    {
        GstBuffer* gb = gst_sample_get_buffer(gs);
        GstMapInfo gm;
        if (!gb)
        {
           return false;
        }
        if (!gst_buffer_map(gb, amp;gm, GST_MAP_READ))
        {
           return false;
        }
        else
        {
            std::cout << "buffer size " << gm.size;
        }
  }
 

Когда я читаю буфер из потока микрофона, все работает так, как ожидалось, и я получаю буферы размером 3840 (3840 / 2 / 4 = 48000 кГц),но когда я читаю из файла .ogg, у меня странный размер буфера, который обычно составляет 2048, а иногда и меньше…
Почему это так работает?