感谢您花些时间阅读我的问题。
我正在使用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不成功:(
所以我有两个问题要问你们:
我想指出,我不能只使用ffmpeg或libav,因为我无法承担我的软件的任何许可,并且不希望它受到GPL许可。但如果Windows媒体基金会有替代方法将原始音频文件编码为aac,我会很高兴听到它们。
最后,抱歉我的英语不好,这显然不是我的母语,如果我让你的眼睛流血,我很抱歉。 (如果我让你笑的话,我很高兴)
度过愉快的一天
答案 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)。