如何播放同时下载的mp3?

时间:2013-08-08 19:57:19

标签: c++ windows audio mp3 directshow

我编写了下载mp3文件的程序。它工作正常。我的下一个任务是使用DirectShow播放同时下载的文件。 在MSDN网站上,我找到并复制了这段代码:

HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        //
    }
IGraphBuilder *pGraph;
hr = CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);

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

hr = pGraph->RenderFile(L"C:\\Test.mp3", NULL);

hr = pControl->Run();

long evCode = 0;
pEvent->WaitForCompletion(INFINITE, &evCode);

pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();

问题是程序无法播放此文件。 为了写入数据,我使用以下代码打开文件:

TFileStream *MyFile = new TFileStream(path,fmOpenWrite | fmShareDenyNone);

允许其他应用程序读取文件。 我还使用WINAPI函数打开和写入文件,但结果是一样的。

我犯了错误?

请帮助我 - 播放此时下载的文件有哪些方法?

1 个答案:

答案 0 :(得分:2)

标准DirectShow播放假定数据来自文件:File Source (Async) FilterWM ASF Reader Filter获取文件路径并进一步传输数据。由于您的下载仍在进行中,因此您无法提供完整的文件,并且由于不完整和/或因共享冲突而无法播放数据。

要使文件可播放,您可能需要实现从内部缓冲区流式传输数据的自定义源过滤器。如果数据尚不可用,则一旦数据到达,此类过滤器将与下载和服务文件读取请求同步。以这种方式构建的自定义过滤器将替换管道上的文件源(异步)过滤器,其余的管道使用相同的过滤器构建。

Windows SDK Async Filter Sample(\ Samples \ multimedia \ directshow \ filters \ async)可能是此类自定义过滤器的良好起点。