C++ 使用Windows MediaFoundation在Windows 7上的原始音频文件到AAC
感谢您抽出时间阅读我的问题 我正在使用Qt和Windows API开发C++应用程序。 我正在以原始格式录制麦克风输出的小10s音频文件,我想将它们转换为aac格式 我试着尽可能多地阅读,并认为从Windows MediaFoundation转码API开始。 问题是,我似乎无法在“CreateObjectFromUrl”函数中使用.raw或.pcm文件,所以我现在几乎被困在这里。它一直在失败。hr返回代码等于322091460。我尝试过向函数传递一个.mp3文件,当然它可以工作,所以没有url人为错误C++ 使用Windows MediaFoundation在Windows 7上的原始音频文件到AAC,c++,audio,encoding,aac,ms-media-foundation,C++,Audio,Encoding,Aac,Ms Media Foundation,感谢您抽出时间阅读我的问题 我正在使用Qt和Windows API开发C++应用程序。 我正在以原始格式录制麦克风输出的小10s音频文件,我想将它们转换为aac格式 我试着尽可能多地阅读,并认为从Windows MediaFoundation转码API开始。 问题是,我似乎无法在“CreateObjectFromUrl”函数中使用.raw或.pcm文件,所以我现在几乎被困在这里。它一直在失败。hr返回代码等于322091460。我尝试过向函数传递一个.mp3文件,当然它可以工作,所以没有url人
MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID;
IMFSourceResolver* pSourceResolver = NULL;
IUnknown* pUnkSource = NULL;
// Create the source resolver.
hr = MFCreateSourceResolver(&pSourceResolver);
if (FAILED(hr))
{
qDebug() << "Failed !";
}
// Use the source resolver to create the media source.
hr = pSourceResolver->CreateObjectFromURL(
sURL, // URL of the source.
MF_RESOLUTION_MEDIASOURCE, // Create a source object.
NULL, // Optional property store.
&ObjectType, // Receives the created object type.
&pUnkSource // Receives a pointer to the media source.
);
MF\u OBJECT\u TYPE ObjectType=MF\u OBJECT\u无效;
IMFSourceResolver*pSourceResolver=NULL;
IUnknown*pUnkSource=NULL;
//创建源解析程序。
hr=MFCreateSourceResolver(&pSourceResolver);
如果(失败(小时))
{
qDebug()CreateObjectFromURL(
sURL,//源的URL。
MF\u RESOLUTION\u MEDIASOURCE,//创建一个源对象。
NULL,//可选属性存储。
&ObjectType,//接收创建的对象类型。
&pUnkSource//接收指向媒体源的指针。
);
MFCreateSourceResolver工作正常,但CreateObjectFromURL未成功:(
所以我有两个问题要问你们:
<> LI>有可能使用Windows Media Foundation?< /LI>将原始音频文件编码到AAC文件吗?
HRESULT
代码。用于方便地为您解码。该代码表示0xC00D36C4
MF\u E\u UNSUPPORTED\u BYTESTREAM\u TYPE
“不支持给定URL的字节流类型。”
问题是基本上不支持这些原始文件,.WAV是一个很好的原始音频源-该文件包含格式描述符和负载
显然,您可以自己读取原始音频文件中的数据,并通过Media Foundation的imf转换
接口将其压缩到AAC。这相当简单,并且您在输出中有AAC数据,例如写入原始.AAC
媒体基础的另一个选项是DirectShow(有合适的编解码器,虽然我认为它可能不是那么容易开始),FFMPEG的<代码> LabavCODEC (在LGPL,而不是GPL下可用).
Hi Roman,非常感谢您的回答。它让事情变得非常清楚,我非常感谢您的时间。我将使用WMF的AAC编码器获取原始AAC,看看我能从那里做些什么。如果我可以问您另外两分钟的知识,因为我几乎是音频编码的初学者……我似乎找不到任何代码示例帮助我了解将pcm转换为aac应遵循哪些步骤。由于您的帮助,我现在了解到,我需要创建一个IMFTTransform接口,设置输入原始值和输出aac,设置采样持续时间并调用ProcessOutput。有这么简单吗?不幸的是,我不知道有好的参考示例代码。不过,我过去一直使用它过去有段时间,所以我知道它工作得很好。是的,您基本上需要遵循并实例化MFT类,设置输入媒体类型,设置输出媒体类型(小心!),然后使用ProcessInput
推送PCM数据,并使用ProcessOutput
拉取AAC数据。