Eya*_*ida 5 c++ audio encoding aac ms-media-foundation
感谢您花些时间阅读我的问题.
我正在使用Qt和Windows API开发C++应用程序.
我正在以原始格式录制小型10s音频文件中的麦克风输出,我想将它们转换为aac格式.
我试图尽可能多地阅读,并认为从windows media foundation转码API开始是一个好主意.
问题是,我似乎无法在"CreateObjectFromUrl"函数中使用.raw或.pcm文件,因此我暂时停留在这里.它一直在失败.hr返回代码等于3222091460.我试图将.mp3文件传递给函数,当然它可以工作,所以不涉及url-human-failure.
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.
);
Run Code Online (Sandbox Code Playgroud)
MFCreateSourceResolver工作正常,但CreateObjectFromURL不成功:(
所以我有两个问题给大家:
我想指出,我不能只使用ffmpeg或libav,因为我无法承担我的软件的任何许可,并且不希望它受到GPL许可.但是如果Windows媒体基础的替代品可以将原始音频文件编码为aac,我很高兴听到它们.
最后,抱歉我的英语不好,这显然不是我的母语,如果我让你的眼睛流血,我很抱歉.(如果我让你笑的话,我很开心)
祝你今天愉快
hr 返回码等于 3222091460
这些是HRESULT
代码。使用这个“ShowHresult”工具可以方便地为您解码它们。该代码的意思是0xC00D36C4
MF_E_UNSUPPORTED_BYTESTREAM_TYPE
“不支持给定 URL 的字节流类型”。
问题基本上是不支持这些原始文件,.WAV 是原始音频的良好来源 - 该文件同时包含格式描述符和有效负载。
显然,您可以自己从原始音频文件中读取数据,并通过其接口使用 Media Foundation 的AAC 编码器IMFTransform
压缩为 AAC 。这相当简单,并且输出上有 AAC 数据,例如可以写入 raw .AAC
。
Media Foundation 的替代选项是 DirectShow(有合适的编解码器,但我认为它可能不太容易启动)、libfaac
FFmpeg libavcodec
(在 LGPL 下可用,而不是 GPL)。