问题描述
我需要从缓冲区(即 wav 字节)创建一个阅读器才能做到这一点我正在使用这种方法:
void co_AudioEncoderMF::load_from_memory(unsigned char const * data,long data_size)
{
unsigned char * buf = new unsigned char[data_size]; //JUST FOR TEST IN ORDER TO BE SURE THAT I HAVE THIS DATA
memcpy(buf,data,data_size);
IMFMediaType *input_type = nullptr;
IMFSourceReader *source_reader = nullptr;
IMFMediaType *ouput_media_type = nullptr;
IMFSinkWriter *sink_writer = nullptr;
IStream * stream = nullptr;
IMFByteStream * byte_stream = nullptr;
HRESULT hr = InitAndStartCOMLib();
if (SUCCEEDED(hr))
{
hr = create_stream(buf,data_size,&stream); <---- HERE I CREATE A STREAM
}
if (SUCCEEDED(hr))
{
hr = MFCreateMFByteStreamOnStream(stream,&byte_stream);
}
HGLOBAL hGlobal = nullptr;
//IMFSourceReader *pReader = nullptr;
if (SUCCEEDED(hr))
{
GetHGlobalFromStream(stream,&hGlobal);
hr = create_source_reader(byte_stream,&source_reader); <----- HERE I CREATE A READER
}
...
}
HRESULT co_AudioEncoderMF::InitAndStartCOMLib()
{
HRESULT hr = S_OK;
HeapSetinformation(nullptr,HeapEnableTerminationOnCorruption,nullptr,0);
// Initialize the COM library.
hr = CoInitializeEx(nullptr,COINIT_APARTMENTTHREADED | COINIT_disABLE_OLE1DDE);
// Initialize the Media Foundation platform.
if (SUCCEEDED(hr))
{
hr = MFStartup(MF_VERSION);
}
return hr;
}
HRESULT co_AudioEncoderMF::create_stream(unsigned char const * pData,long dataLen,IStream ** out_stream)
{
HGLOBAL m_phMem = ::GlobalAlloc(GMEM_MOVEABLE,dataLen);
if (!m_phMem)
{
printf("Error AfxThrowMemoryException");
}
LPVOID dest = ::GlobalLock(m_phMem);
memcpy(dest,pData,dataLen);
::GlobalUnlock(m_phMem);
return CreateStreamOnHGlobal(m_phMem,FALSE /*fDeleteOnRelease*/,out_stream);// NOTE :: in order to get more flexablity need to consider such an approach https://gist.github.com/alekseytimoshchenko/e8f52604fdeb50c8ad7873aeb8281bfa
}
HRESULT co_AudioEncoderMF::create_source_reader(IMFByteStream * in_byte_stream,IMFSourceReader **source_reader)
{
HRESULT hr = S_OK;
IMFAttributes * attr = nullptr;
hr = MFCreateAttributes(&attr,10);
if (SUCCEEDED(hr))
{
hr = attr->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS,true);
}
else
{
printf("Error MFCreateAttributes");
}
if (SUCCEEDED(hr))
{
hr = MFCreateSourceReaderFromByteStream(in_byte_stream,attr,source_reader); <----- AND HERE I GOT MY ERROR ABOUT UNSUPPORTED FORMAT
}
else
{
printf("Error Atrr->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS,true)");
}
if (Failed(hr))
{
printf("Error MFCreateSourceReaderFromByteStream");
}
return hr;
}
我正在使用相同的方法,但使用 mp3 字节并且它有效,我认为它有区别,但我不知道如何批准和解决。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)