如何从 DirectShow 获取未压缩的字节数组?
How to get uncompressed byte array from DirectShow?
我正在尝试使用 DirectShow https://docs.microsoft.com/en-us/windows/win32/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 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
方法的场景中并且您没有数据。
访问内容的典型方法是围绕 Sample Grabber Filter. There is a huge amount of code and questions explaining the approach. The relevant keyword is SampleCB
standing for ISampleGrabberCB::SampleCB
method. For example: ffmpeg audio frame from directshow sampleCB imediasample 构建管道。
我正在尝试使用 DirectShow https://docs.microsoft.com/en-us/windows/win32/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 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
方法的场景中并且您没有数据。
访问内容的典型方法是围绕 Sample Grabber Filter. There is a huge amount of code and questions explaining the approach. The relevant keyword is SampleCB
standing for ISampleGrabberCB::SampleCB
method. For example: ffmpeg audio frame from directshow sampleCB imediasample 构建管道。