C++ 如何从DirectShow获取未压缩的字节数组?

C++ 如何从DirectShow获取未压缩的字节数组?,c++,directshow,C++,Directshow,我正在尝试使用DirectShow 以便从.mp3流中获取未压缩的字节数组。我有一个可以播放.mp3字节流的实现 bool coAudioPlayer::LoadImp(SoundDataType dataType, std::string const & filename, unsigned char const * pData, int64_t dataLen, bool bOnlyIfFilenameChanged) { ... m_pMemReader = new CMe

我正在尝试使用DirectShow 以便从
.mp3
流中获取未压缩的字节数组。我有一个可以播放
.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
对其进行解码,但我看不到任何方法来检索此解码阵列

有没有办法做到这一点?

“未压缩字节数组”对所需数据的定义相当错误。没有字节数组格式的媒体数据。MP3音频通常由MP3解码器媒体对象包装器解压缩到DirectShow过滤器中,转换成具有特定属性(采样率、通道计数、每个采样的位数)的
MEDIASUBTYPE_PCM
格式的音频。具体来说,选定的位深度(此解码器支持多个位深度选项!)直接将音频数据的表示形式定义为字节数组

在构建回放管道时,您不需要或不想访问数据,例如在使用您提到的
Render
方法的场景中,并且您没有数据

访问内容的一种典型方式是围绕内容构建管道。有大量的代码和问题来解释这种方法。相关关键字是
SampleCB
代表方法。例如:.

“未压缩字节数组”是对所需数据的错误定义。没有字节数组格式的媒体数据。MP3音频通常由MP3解码器媒体对象包装器解压缩到DirectShow过滤器中,转换成具有特定属性(采样率、通道计数、每个采样的位数)的
MEDIASUBTYPE_PCM
格式的音频。具体来说,选定的位深度(此解码器支持多个位深度选项!)直接将音频数据的表示形式定义为字节数组

在构建回放管道时,您不需要或不想访问数据,例如在使用您提到的
Render
方法的场景中,并且您没有数据


访问内容的一种典型方式是围绕内容构建管道。有大量的代码和问题来解释这种方法。相关关键字是
SampleCB
代表方法。例如:.

编写一个自定义DirectShow筛选器,对帧执行某些操作,并将其附加到memreader的输出引脚。关于这方面的Microsoft文档非常优秀。您可以从过滤器开始。@Botje您认为这种方法如何?看起来相关,不是吗?该接口与属于过滤器的输入引脚相关联;公开一个或多个实现此接口的管脚。编写一个自定义DirectShow筛选器,对帧执行某些操作,并将其附加到memreader的输出管脚。关于这方面的Microsoft文档非常优秀。您可以从过滤器开始。@Botje您认为这种方法如何?看起来相关,不是吗?该接口与属于过滤器的输入引脚相关联;A公开实现此接口的一个或多个管脚。