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

时间:2012-09-16 10:44:51

标签: 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.
        );

MFCreateSourceResolver工作正常,但CreateObjectFromURL不成功:(

所以我有两个问题要问你们:

  1. 是否可以使用Windows Media Foundation将原始音频文件编码为aac文件?
  2. 如果是,我应该阅读什么才能达到我的目的?
  3. 我想指出,我不能只使用ffmpeg或libav,因为我无法承担我的软件的任何许可,并且不希望它受到GPL许可。但如果Windows媒体基金会有替代方法将原始音频文件编码为aac,我会很高兴听到它们。

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

    度过愉快的一天

1 个答案:

答案 0 :(得分:3)

  

hr返回码等于3222091460

这些是HRESULT代码。使用this "ShowHresult" tool可以方便地为您解码。代码表示0xC00D36C4 MF_E_UNSUPPORTED_BYTESTREAM_TYPE“不支持给定URL的字节流类型。”

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

您显然可以自己从原始音频文件中读取数据,然后使用Media Foundation的AAC Encoder通过其IMFTransform接口压缩到AAC。这非常简单,您可以在输出上输入AAC数据。写入原始.AAC

Media Foundation的替代选项是DirectShow(有合适的​​编解码器,虽然我认为开始可能不是那么容易),libfaac,FFmpeg的libavcodec(在LGPL下可用,而不是GPL)。