Как получить uncompressed byte array (DirectShow)?

339
31 мая 2022, 13:00

Я использую DirectShow https://docs.microsoft.com/en-us/windows/win32/directshow/directshow для того, чтоб проигрывать .mp3 стрим. У меня есть вот такая имплементация

bool coAudioPlayer::LoadImp(SoundDataType dataType, std::string const & filename, unsigned char const * pData, int64_t dataLen, bool bOnlyIfFilenameChanged)
{
...
    m_pMemReader = new CMemReader(m_pMemStream, m_pMediaType, &hr);
    m_pMemReader->AddRef();

    hr = CoCreateInstance(CLSID_FilterGraph,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_IGraphBuilder,
        (void **)&this->m_pigb);
    hr = m_pigb->AddFilter(m_pMemReader, NULL);
    if (FAILED(hr))
    {
        return false;
    }
    m_pigb->QueryInterface(IID_IMediaControl, (void **)&m_pimc);
    m_pigb->QueryInterface(IID_IMediaEventEx, (void **)&m_pimex);
    m_pigb->QueryInterface(IID_IBasicAudio, (void**)&m_piba);
    m_pigb->QueryInterface(IID_IMediaSeeking, (void**)&m_pims);
    /*  Render our output pin */
    hr = m_pigb->Render(m_pMemReader->GetPin(0));
    if (!SUCCEEDED(hr))
    {
        return false;
    }
    HRESULT hr = m_pimc->Run();
    return m_bReady;
}

Но мне нужно добавить возможность получения декодированного стрима. Насколько я понимаю DirectShow декодит это внутри, так вот вопрос в том если можно эту декодинг дату как то получить?

Answer 1

Я уже ответил на большом StackOverflow... То, что вам посоветовали делать фильтр - так тоже можно, но не [обязательно] нужно. С учётом того, что вы задаёте тот вопрос, который задали, сделать фильтр будет где-то на порядок сложнее, но с тем же конечным результатом.

Еще один пример того, как используется Sample Grabber: https://www.codeproject.com/Articles/34663/DirectShow-Examples-for-Using-SampleGrabber-for-Gr Вторая часть посвящена аудио.

UPD. Тракты воспроизведения состоят из фильтров, и, соответственно, нужно или использовать имеющиеся или писать свой. Связка Sample Grabber + Null Renderer даёт возможность не делать свой фильтр и посредством callback'а получать доступ к данным. Актуальный формат данных можно настроить посредством настройки фильтра Sample Grabber.

Сам Sample Grabber отмечен как deprecated/устаревший. Это - так, но всё же он присутствует во всех текущих версиях Windows за исключением UWP приложений, где DirectShow API не будет уже никогда.

  • Using the Sample Grabber
READ ALSO
Как написать текст символами в консоль Visual Studio?

Как написать текст символами в консоль Visual Studio?

Язык программирования с++Нужно вставить надпись

357
Ошибка [ilink64 Error] Error: Unresolved external в C++ Builder 10.3

Ошибка [ilink64 Error] Error: Unresolved external в C++ Builder 10.3

Начал изучать C++ Builder 103 и сразу столкнулся с непонятной ошибкой

230
C++ парсинг строки на числа

C++ парсинг строки на числа

Друзья! Подскажите, пожалуйста, наиболее элегантный способ следзадачи:

202
Fatal error: Uncaught Error: Call to undefined function mysql_connect()

Fatal error: Uncaught Error: Call to undefined function mysql_connect()

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in C:\Users\user\Desktop\open\OpenServer\domains\lazarua\index

302