在Windows 7上使用Windows Media Foundation将原始音频文件发送到AAC

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不成功:(

所以我有两个问题给大家:

  1. 是否可以使用Windows Media Foundation将原始音频文件编码为aac文件?
  2. 如果是的话,我应该阅读什么才能实现我的目标?

我想指出,我不能只使用ffmpeg或libav,因为我无法承担我的软件的任何许可,并且不希望它受到GPL许可.但是如果Windows媒体基础的替代品可以将原始音频文件编码为aac,我很高兴听到它们.

最后,抱歉我的英语不好,这显然不是我的母语,如果我让你的眼睛流血,我很抱歉.(如果我让你笑的话,我很开心)

祝你今天愉快

Rom*_* R. 5

hr 返回码等于 3222091460

这些是HRESULT代码。使用这个“ShowHresult”工具可以方便地为您解码它们。该代码的意思是0xC00D36C4 MF_E_UNSUPPORTED_BYTESTREAM_TYPE“不支持给定 URL 的字节流类型”。

问题基本上是不支持这些原始文件,.WAV 是原始音频的良好来源 - 该文件同时包含格式描述符和有效负载。

显然,您可以自己从原始音频文件中读取数据,并通过其接口使用 Media Foundation 的AAC 编码器IMFTransform压缩为 AAC 。这相当简单,并且输出上有 AAC 数据,例如可以写入 raw .AAC

Media Foundation 的替代选项是 DirectShow(有合适的​​编解码器,但我认为它可能不太容易启动)、libfaacFFmpeg libavcodec(在 LGPL 下可用,而不是 GPL)。