用directshow, 采集视频和音频, 预览的同时同时保存为wmv文件.保存完毕之后, 打开保存的wmv文件, 播放一秒钟就卡住了, 画面不动, 声音也没有.但是如果点一下进度条跳到其他时刻又可以播放.网上查了资料, 说要用IConfigAsfWriter来设置AsfWriter的profile, 不知道这个原因.谁知道是怎么回事呢? 在线等.
解决方案 »
- 消息模型、PeekMessage
- 如何实现Ctrl+=快捷键?
- 在dll中连接数据库
- 请问斑竹 我的‘求 Visual C++精彩实例详解. 袁丁 编著. 北京 机械工业出版社 2003. TP312C Z782 配套光盘 下载地址 ’怎么送分 谢
- 如何实现向对话框中添加Splitter bar?
- 谁能告诉我为什么不能catch这个异常?
- 用stl不用mfc怎么访问数据库,在线等救!
- vc开发的64位应用程序怎么访问WebService
- MFC下调用封装成DLL的函数,在窗口失焦的时候封装的函数不运行
- 插入真的那么困难嘛?
- VS2005 MFC中怎样动态加载DLL, 实现多语言支持?
- 怎么样非常准确获取Windows各进程使用内存与系统内存占用率
/* 设置视频捕获设备过滤器 */
HRESULT CollectionController::setVideoDevice()
{
HRESULT hr = S_OK; do
{
/* 创建系统设备枚举器 */
ICreateDevEnum * pCreateDevEnum;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void * *)&pCreateDevEnum);
if(FAILED(hr)) break; /* 创建视频采集设备枚举器 */
IEnumMoniker * pEnumMoniker;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0);
if(FAILED(hr)) break; ULONG ulFetched = 0;
IMoniker * pMoniker = NULL; if(pEnumMoniker->Next(1, &pMoniker, &ulFetched) == S_OK)
{
/* 得到视频捕获设备 */
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void * *)&m_pVideoCapture);
if(FAILED(hr)) break; pMoniker->Release();
}
pEnumMoniker->Release();
pCreateDevEnum->Release(); /* 把设备添加到过滤器通道中 */
hr = m_pFilterGraph->AddFilter(m_pVideoCapture, L"Video Capture Filter");
if(FAILED(hr)) break; }while(FALSE);
return hr;
}
/* 设置音频捕获设备过滤器 */
HRESULT CollectionController::setAudioDevice()
{
/* 标记返回值 */
HRESULT hr = S_OK; do
{
/* 创建系统设备枚举器 */
CComPtr<ICreateDevEnum> pCreateDevEnum;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void * *)&pCreateDevEnum);
if(FAILED(hr)) break; /* 创建音频采集设备枚举器 */
CComPtr<IEnumMoniker> pEnumMoniker;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pEnumMoniker, 0);
if(FAILED(hr)) break; ULONG ulFetched = 0;
IMoniker * pMoniker = NULL; if(pEnumMoniker->Next(1, &pMoniker, &ulFetched) == S_OK)
{
/* 得到音频捕获设备 */
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void * *)&m_pAudioCapture);
if(FAILED(hr)) break; pMoniker->Release();
}
pEnumMoniker.Release();
pCreateDevEnum.Release();
/* 把设备添加到过滤器通道中 */
hr = m_pFilterGraph->AddFilter(m_pAudioCapture, L"Audio Capture Filter");
if(FAILED(hr)) break;
}while(FALSE); return hr;
}
/* 采集,预览并且保存为文件 */
HRESULT CollectionController::start(HWND hWnd)
{
HRESULT hr = S_OK; do
{
/* 设置音频捕获设备过滤器 */
hr = setAudioDevice();
if(FAILED(hr)) break; /* 设置视频捕获设备过滤器 */
hr = setVideoDevice();
if(FAILED(hr)) break; /* 将filter加入到graph中 */
hr = addFilter();
if(FAILED(hr)) break; /* 预览 */
hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, m_pAudioCapture, NULL, NULL);
if(FAILED(hr)) break; hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, m_pVideoCapture, NULL, NULL);
if(FAILED(hr)) break;
/* 设置窗口 */
hr = setDisplayWnd(hWnd);
if(FAILED(hr)) break; /*
写到文件
*/
IBaseFilter * pWriter;
hr = m_pCaptureGB->SetOutputFileName(&MEDIASUBTYPE_Asf, L"e:\\1.asf", &pWriter, NULL);
if(FAILED(hr)) break; /* 对pWriter(AsfWriter)进行设置 */
IConfigAsfWriter *pConfig = 0;
hr = pWriter->QueryInterface(IID_IConfigAsfWriter, (void**)&pConfig);
if(SUCCEEDED(hr))
{
pConfig->Release();
}
hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Audio, m_pAudioCapture, NULL, pWriter);
if(FAILED(hr)) break; hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_pVideoCapture, NULL, pWriter);
if(FAILED(hr)) break; /* 开始采集 */
hr = m_pMediaControl->Run();
if(FAILED(hr)) break; }while(FALSE); return hr;
}
============================/* 设置视频捕获设备过滤器 */
HRESULT CollectionController::setVideoDevice()
{
HRESULT hr = S_OK;do
{
/* 创建系统设备枚举器 */
ICreateDevEnum * pCreateDevEnum;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void * *)&pCreateDevEnum);
if(FAILED(hr)) break;/* 创建视频采集设备枚举器 */
IEnumMoniker * pEnumMoniker;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0);
if(FAILED(hr)) break;ULONG ulFetched = 0;
IMoniker * pMoniker = NULL;if(pEnumMoniker->Next(1, &pMoniker, &ulFetched) == S_OK)
{
/* 得到视频捕获设备 */
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void * *)&m_pVideoCapture);
if(FAILED(hr)) break;pMoniker->Release();
}
pEnumMoniker->Release();
pCreateDevEnum->Release();/* 把设备添加到过滤器通道中 */
hr = m_pFilterGraph->AddFilter(m_pVideoCapture, L"Video Capture Filter");
if(FAILED(hr)) break;}while(FALSE);return hr;
}
/* 设置音频捕获设备过滤器 */
HRESULT CollectionController::setAudioDevice()
{
/* 标记返回值 */
HRESULT hr = S_OK;do
{
/* 创建系统设备枚举器 */
CComPtr<ICreateDevEnum> pCreateDevEnum;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void * *)&pCreateDevEnum);
if(FAILED(hr)) break;/* 创建音频采集设备枚举器 */
CComPtr<IEnumMoniker> pEnumMoniker;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pEnumMoniker, 0);
if(FAILED(hr)) break;ULONG ulFetched = 0;
IMoniker * pMoniker = NULL;if(pEnumMoniker->Next(1, &pMoniker, &ulFetched) == S_OK)
{
/* 得到音频捕获设备 */
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void * *)&m_pAudioCapture);
if(FAILED(hr)) break;pMoniker->Release();
}
pEnumMoniker.Release();
pCreateDevEnum.Release();/* 把设备添加到过滤器通道中 */
hr = m_pFilterGraph->AddFilter(m_pAudioCapture, L"Audio Capture Filter");
if(FAILED(hr)) break;}while(FALSE);return hr;
}
/* 采集,预览并且保存为文件 */
HRESULT CollectionController::start(HWND hWnd)
{
HRESULT hr = S_OK;do
{
/* 设置音频捕获设备过滤器 */
hr = setAudioDevice();
if(FAILED(hr)) break;/* 设置视频捕获设备过滤器 */
hr = setVideoDevice();
if(FAILED(hr)) break;/* 将filter加入到graph中 */
hr = addFilter();
if(FAILED(hr)) break;/* 预览 */
hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, m_pAudioCapture, NULL, NULL);
if(FAILED(hr)) break;hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, m_pVideoCapture, NULL, NULL);
if(FAILED(hr)) break;
/* 设置窗口 */
hr = setDisplayWnd(hWnd);
if(FAILED(hr)) break;/*
写到文件
*/
IBaseFilter * pWriter;hr = m_pCaptureGB->SetOutputFileName(&MEDIASUBTYPE_Asf, L"e:\\1.asf", &pWriter, NULL);
if(FAILED(hr)) break;/* 对pWriter(AsfWriter)进行设置 */
IConfigAsfWriter *pConfig = 0;
hr = pWriter->QueryInterface(IID_IConfigAsfWriter, (void**)&pConfig);
if(SUCCEEDED(hr))
{
pConfig->Release();
}hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Audio, m_pAudioCapture, NULL, pWriter);
if(FAILED(hr)) break;hr = m_pCaptureGB->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_pVideoCapture, NULL, pWriter);
if(FAILED(hr)) break;/* 开始采集 */
hr = m_pMediaControl->Run();
if(FAILED(hr)) break; }while(FALSE);return hr;
}
DX SDK里面也说的很明确了,在渲染之前要进行接口配置、。
原文:it must be configured before it can be connected to upstream filters