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函数打开和写入文件,但结果是一样的。
我犯了错误?
请帮助我 - 播放此时下载的文件有哪些方法?
答案 0 :(得分:2)
标准DirectShow播放假定数据来自文件:File Source (Async) Filter
或WM ASF Reader Filter
获取文件路径并进一步传输数据。由于您的下载仍在进行中,因此您无法提供完整的文件,并且由于不完整和/或因共享冲突而无法播放数据。
要使文件可播放,您可能需要实现从内部缓冲区流式传输数据的自定义源过滤器。如果数据尚不可用,则一旦数据到达,此类过滤器将与下载和服务文件读取请求同步。以这种方式构建的自定义过滤器将替换管道上的文件源(异步)过滤器,其余的管道使用相同的过滤器构建。
Windows SDK Async Filter Sample(\ Samples \ multimedia \ directshow \ filters \ async)可能是此类自定义过滤器的良好起点。