我是 COM 和 Windows 编程的新手。我正在尝试使用媒体基础播放 mp3 文件。
下面是我尝试在 Windows 10 上执行的代码。这是我在这段代码中所做的概述。
我先初始化COM 然后我开始媒体基金会。 然后我在源解析器的帮助下创建了媒体源 然后我创建了一个 MP3 解码器 MFT 然后我创建了一个音频媒体激活对象 然后我创建了一个音频媒体接收器 然后我创建了一个拓扑 然后我创建了 3 个拓扑节点并向其添加了媒体源、Mp3 解码器和音频媒体接收器。 然后我将所有拓扑节点添加到拓扑中 然后我创建了媒体会话并将拓扑添加到媒体会话 然后我开始了媒体会议。 然后我释放所有的 COM 对象。 然后我关闭了媒体基金会。 然后我取消初始化 COM.
但不幸的是,文件没有开始播放。
请告诉我我的代码有什么问题。
#include <iostream>
#include <mfapi.h>
#include <mfidl.h>
#include <mfreadwrite.h>
#include <Wmcodecdsp.h>
#include <combaseapi.h>
int main()
{
HRESULT hr=CoInitialize(NULL);
if(SUCCEEDED(hr)){
// Initialize the Media Foundation platform.
MFStartup(MF_VERSION);
MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID;
IMFSourceResolver* pSourceResolver;
IUnknown* pSource = nullptr;
IMFMediaSource* mSource;
IMFPresentationDescriptor* ppPresentationDescriptor;
IMFTransform* mtransform = NULL;
IMFTopology* topology = NULL;
IMFStreamDescriptor* sdesip = NULL;
IMFTopologyNode* source = NULL;
IMFTopologyNode* transform;
IMFTopologyNode* output = NULL;
IMFMediaSink* mediasink = NULL;
IMFMediaTypeHandler* mediatypehandler;
IMFMediaType* mediatype;
IMFMediaType* decodermediatype;
IMFMediaSession* mediasession;
MFCreateSourceResolver(&pSourceResolver);
pSourceResolver->CreateObjectFromURL(
L"song.mp3", // URL of the source.
MF_RESOLUTION_MEDIASOURCE, // Create a source object.
NULL, // Optional property store.
&ObjectType, // Receives the created object type.
&pSource // Receives a pointer to the media source.
);
pSource->QueryInterface(IID_PPV_ARGS(&mSource));
mSource->CreatePresentationDescriptor(&ppPresentationDescriptor);
ppPresentationDescriptor->SelectStream(0);
hr = CoCreateInstance(__uuidof(CMP3DecMediaObject),
NULL,
CLSCTX_INPROC_SERVER,
IID_IMFTransform,
(void**)&mtransform);
if (SUCCEEDED(hr)) {
}
MFCreateTopology(
&topology
);
MFCreateTopologyNode(MF_TOPOLOGY_SOURCESTREAM_NODE, &source);
source->SetUnknown(MF_TOPONODE_SOURCE, mSource);
source->SetUnknown(MF_TOPONODE_PRESENTATION_DESCRIPTOR, ppPresentationDescriptor);
BOOL value;
ppPresentationDescriptor->GetStreamDescriptorByIndex(0, &value, &sdesip);
MFCreateMediaType(&decodermediatype);
decodermediatype->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
decodermediatype->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
decodermediatype->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, 1);
sdesip->GetMediaTypeHandler(&mediatypehandler);
mediatypehandler->GetCurrentMediaType(&mediatype);
mtransform->SetInputType(0, mediatype, NULL);
mtransform->SetOutputType(0, decodermediatype, NULL);
source->SetUnknown(MF_TOPONODE_STREAM_DESCRIPTOR, sdesip);
topology->AddNode(source);
MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &transform);
transform->SetObject(mtransform);
topology->AddNode(transform);
IMFActivate* active;
hr = MFCreateAudioRendererActivate(&active);
if (SUCCEEDED(hr)) {
}
hr = active->ActivateObject(__uuidof(IMFMediaSink), (void**)&mediasink);
if (SUCCEEDED(hr)) {
}
MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &output);
std::cout<<
output->SetObject(mediasink);
output->SetUINT32(MF_TOPONODE_STREAMID, 0);
output->SetUINT32(MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, FALSE);
topology->AddNode(output);
source->ConnectOutput(0, transform, 0);
transform->ConnectOutput(0, output, 0);
MFCreateMediaSession(
NULL,
&mediasession
);
PROPVARIANT var;
PropVariantInit(&var);
var.vt = VT_I8;
var.hVal.QuadPart = 0; // 10^7 = 1 second.
mediasession->SetTopology(MFSESSION_SETTOPOLOGY_NORESOLUTION, topology);
mediasession->Start(NULL, &var);
pSourceResolver->Release();
pSource->Release();
mSource->Release();
ppPresentationDescriptor->Release();
mtransform->Release();
topology->Release();
sdesip->Release();
source->Release();
transform->Release();
output->Release();
mediatypehandler->Release();
mediatype->Release();
decodermediatype->Release();
mediasession->Shutdown();
mediasession->Release();
mediasink->Release();
MFShutdown();
}
CoUninitialize();
}