用directshow,采集视频和音频的问题

bd17kaka1120 2011-07-22 06:45:34
用directshow, 采集视频和音频, 预览的同时同时保存为wmv文件.

保存完毕之后, 打开保存的wmv文件, 播放一秒钟就卡住了, 画面不动, 声音也没有.

但是如果点一下进度条跳到其他时刻又可以播放.

网上查了资料, 说要用IConfigAsfWriter来设置AsfWriter的profile, 不知道这个原因.

谁知道是怎么回事呢? 在线等.
...全文
487 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuyuge0 2012-11-03
  • 打赏
  • 举报
回复
楼主,在renderstream之前要进行对ASF writer进行配置,就是IConfigAsfWriter,我看楼主也获得了这个接口,接下调用接口函数ConfigureFilterUsingProfile,或者SetIndexMode配置下就ok了,不会出现卡屏的问题。 DX SDK里面也说的很明确了,在渲染之前要进行接口配置、。 原文:it must be configured before it can be connected to upstream filters
觅食的猫猫 2011-10-14
  • 打赏
  • 举报
回复
预览占用大部分CPU?
ggc2508 2011-10-14
  • 打赏
  • 举报
回复
你的代码,我试了,挺好,没问题啊!只是我保存的AVI格式
bd17kaka1120 2011-08-04
  • 打赏
  • 举报
回复
可以. 可是用别的就不行
[Quote=引用 11 楼 buyong 的回复:]
你保存的文件用windows自带的播放器能否正常播放?
[/Quote]
buyong 2011-08-02
  • 打赏
  • 举报
回复
你保存的文件用windows自带的播放器能否正常播放?
信阳毛尖 2011-08-02
  • 打赏
  • 举报
回复
或者............
jyh_baoding 2011-08-02
  • 打赏
  • 举报
回复
是不是文件有什么不能识别的字符
aavv778899 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bd17kaka1120 的回复:]
是啊,都是在网上找的一些代码.我贴在这把.
/* 设置视频捕获设备过滤器 */
HRESULT CollectionController::setVideoDevice()
{
HRESULT hr = S_OK;

do
{
/* 创建系统设备枚举器 */
ICreateDevEnum * pCreateDevEnum;
hr = CoCreateInstance(CLSID……
[/Quote]

============================

/* 设置视频捕获设备过滤器 */
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;
}
aavv778899 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bd17kaka1120 的回复:]
是啊,都是在网上找的一些代码.我贴在这把.
/* 设置视频捕获设备过滤器 */
HRESULT CollectionController::setVideoDevice()
{
HRESULT hr = S_OK;

do
{
/* 创建系统设备枚举器 */
ICreateDevEnum * pCreateDevEnum;
hr = CoCreateInstance(CLSID……
[/Quote]

===================
帮顶...
bd17kaka1120 2011-07-25
  • 打赏
  • 举报
回复
是啊,都是在网上找的一些代码.我贴在这把.
/* 设置视频捕获设备过滤器 */
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;
}

[Quote=引用 5 楼 machh 的回复:]
采集过程应该是没有问题的,

看看你保存文件是怎么处理, 可以保存文件的时候有错误。
[/Quote]
lcyw 2011-07-25
  • 打赏
  • 举报
回复
采集过程应该是没有问题的,

看看你保存文件是怎么处理, 可以保存文件的时候有错误。
alan001 2011-07-24
  • 打赏
  • 举报
回复
up...............
bd17kaka1120 2011-07-24
  • 打赏
  • 举报
回复
没人帮我啊
jsyren 2011-07-23
  • 打赏
  • 举报
回复
我帮你顶
bd17kaka1120 2011-07-23
  • 打赏
  • 举报
回复
自己顶

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧