使用 Microsoft Media Foundation 播放 Mp3 文件 - 没有成功

问题描述 投票:0回答:0

我是 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();
        }
    
ms-media-foundation
© www.soinside.com 2019 - 2024. All rights reserved.