播放音频流通过在C的Windows API ++

问题描述:

要使用(在这种情况下)DirectShow的在Windows中发挥.mp3文件,你只需要:播放音频流通过在C的Windows API ++

#include <dshow.h> 
#include <cstdio> 
// For IID_IGraphBuilder, IID_IMediaControl, IID_IMediaEvent 
#pragma comment(lib, "strmiids.lib") 

const wchar_t* filePath = L"C:/Users/Public/Music/Sample Music/Sleep Away.mp3"; 

int main() 
{ 
    IGraphBuilder *pGraph = NULL; 
    IMediaControl *pControl = NULL; 
    IMediaEvent *pEvent = NULL; 

    // Initialize the COM library. 
    HRESULT hr = ::CoInitialize(NULL); 
    if (FAILED(hr)) 
    { 
     ::printf("ERROR - Could not initialize COM library"); 
     return 0; 
    } 

    // Create the filter graph manager and query for interfaces. 
    hr = ::CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
     IID_IGraphBuilder, (void **)&pGraph); 
    if (FAILED(hr)) 
    { 
     ::printf("ERROR - Could not create the Filter Graph Manager."); 
     return 0; 
    } 

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); 
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); 

    // Build the graph. 
    hr = pGraph->RenderFile(filePath, NULL); 
    if (SUCCEEDED(hr)) 
    { 
     // Run the graph. 
     hr = pControl->Run(); 
     if (SUCCEEDED(hr)) 
     { 
      // Wait for completion. 
      long evCode; 
      pEvent->WaitForCompletion(INFINITE, &evCode); 

      // Note: Do not use INFINITE in a real application, because it 
      // can block indefinitely. 
     } 
    } 
    // Clean up in reverse order. 
    pEvent->Release(); 
    pControl->Release(); 
    pGraph->Release(); 
    ::CoUninitialize(); 
} 

我不能找到一种方法,有这样的事情,但要能够发挥.asx代替,例如像:http://listen.radiotunes.com/public5/solopiano.asx

在MSDN我只能想办法在C#中制作表格应用程序,将在表单中的WindowsMediaPlayer控制做到这一点。

任何想法?

一个.asx文件实际上是一个播放列表。有关格式的一些信息,请参阅here

.asx不受DirectShow支持。有关支持的格式,请参见here

您可能会解析文件,因为它是XML,并查找流的实际URL,然后播放它,或者可以使用Windows Media Player SDK。你可以看到WM SDK here的一些示例代码。

+0

嗯,好吧,这就是了。我试图[这](http://msdn.microsoft.com/en-us/library/windows/desktop/dd564579(v = vs.85).aspx)---但我如何使用该控制在C++中的示例[这里](http://msdn.microsoft.com/en-us/library/windows/desktop/dd564119(v = vs.85).aspx)(也就是我认为的JScript)... – Alex 2014-12-06 14:33:32

+0

WM sdk也应包含一个C++ api。你应该检查文档和标题。 – 2014-12-06 19:52:25

+0

是的,'IWMPPlayer'可以很好地完成这项工作。谢谢:) – Alex 2014-12-06 20:44:23

好,我知道用这个例子从here拍摄工作,并添加此额外的行:hr = spPlayer->put_URL(L"http://listen.radiotunes.com/public5/solopiano.asx");

#include "atlbase.h" 
#include "atlwin.h" 
#include "wmp.h" 
#include <cstdio> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CoInitialize(NULL); 

    HRESULT hr = S_OK; 
    CComBSTR bstrVersionInfo; // Contains the version string. 
    CComPtr<IWMPPlayer> spPlayer; // Smart pointer to IWMPPlayer interface. 



    hr = spPlayer.CoCreateInstance(__uuidof(WindowsMediaPlayer), 0, CLSCTX_INPROC_SERVER); 

    if (SUCCEEDED(hr)) 
    { 
     hr = spPlayer->get_versionInfo(&bstrVersionInfo); 
     hr = spPlayer->put_URL(L"http://listen.radiotunes.com/public5/solopiano.asx"); 

    } 

    if (SUCCEEDED(hr)) 
    { 
     // Show the version in a message box. 
     COLE2T pStr(bstrVersionInfo); 
     MessageBox(NULL, (LPCSTR)pStr, _T("Windows Media Player Version"), MB_OK); 
    } 

    // Clean up. 
    spPlayer.Release(); 
    CoUninitialize(); 

    return 0; 
} 
+0

你不应该在答案中提出另一个问题。将它作为另一个问题发布。 – 2014-12-06 19:22:50

+0

@JonathanPotter行,删除。 – Alex 2014-12-06 20:41:02