Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Windows MediaFoundation在Windows 7上的原始音频文件到AAC_C++_Audio_Encoding_Aac_Ms Media Foundation - Fatal编程技术网

C++ 使用Windows MediaFoundation在Windows 7上的原始音频文件到AAC

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人

感谢您抽出时间阅读我的问题

我正在使用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文件吗?
  • 如果是,我应该阅读什么来完成我想要的
  • 我想指出,我不能只使用ffmpeg或libav,因为我负担不起我的软件的任何许可证,也不希望它处于GPL许可证之下。但是,如果有替代windows media Foundation的方法将原始音频文件编码到aac,我会很高兴听到它们

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

    祝你今天愉快

    hr返回代码等于322091460

    这些是
    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数据。