1

我编写了下载 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函数打开和写入文件,但结果是一样的。

我在哪里犯了错误?

请帮帮我 - 有什么方法可以播放此时下载的文件?

4

1 回答 1

2

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

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

Windows SDK异步过滤器示例(\Samples\multimedia\directshow\filters\async) 可能是此类自定义过滤器的良好起点。

于 2013-08-08T20:06:25.480 回答