6

感谢您花时间阅读我的问题。

我正在使用 Qt 和 windows API 开发一个 C++ 应用程序。

我正在以原始格式录制 10 秒的小音频文件中的麦克风输出,我想将它们转换为 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. 如果是,我应该阅读什么来完成我想要的?

我想指出我不能只使用 ffmpeg 或 libav,因为我买不起我的软件的任何许可证,并且不希望它处于 GPL 许可证下。但是,如果有 Windows 媒体基础的替代方案可以将原始音频文件编码为 aac,我会很高兴听到它们。

最后,对不起我的英语不好,这显然不是我的母语,如果我让你流血了,我很抱歉。(如果我让你发笑,我会很高兴)

祝你今天过得愉快

4

1 回答 1

4

hr 返回码等于 3222091460

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

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

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

Alternate options to Media Foundation is DirectShow (there are suitable codecs, though I thought it might be not so easy to start), libfaac, FFmpeg's libavcodec (available under LGPL, not GPL).

于 2012-09-16T11:02:00.043 回答