directshow中WMV码流的设置

两种方法:

1、选择系统profile

IConfigAsfWriter *pConfig = 0;   
	hr = gcap.pRender->QueryInterface(IID_IConfigAsfWriter, (void**)&pConfig);   
CComPtr <IWMProfileManager> pIWMProfileManager;

  HRESULT hr = WMCreateProfileManager( &pIWMProfileManager );
  if(FAILED(hr)) 
  {
   printf("MapProfile: Failed to create profile manager! hr=0x%x\n", hr);
   return hr;
  }


  CComQIPtr<IWMProfileManager2, &IID_IWMProfileManager2> pIPM2(pIWMProfileManager);
  if(!pIPM2) 
  {
   printf("MapProfile: Failed to QI IWMProfileManager2!\n");
   return E_UNEXPECTED;
  }

  hr = pIPM2->SetSystemProfileVersion( WMT_VER_8_0 );
  if(FAILED(hr))
  {
   printf("MapProfile: Failed to set system profile version! hr=0x%x\n", hr);
   return hr;
  }
   DWORD cProfiles;
  IWMProfile *pProfile;  
  hr = pIWMProfileManager->GetSystemProfileCount( &cProfiles );
  if(FAILED(hr))
  {
   printf("MapProfile: Failed to get system profile count! hr=0x%x\n", hr);
   return hr;
  }
  pIWMProfileManager->LoadSystemProfile(26, &pProfile);//cProfiles 为27 选择最后一个索引26

   hr = pConfig->ConfigureFilterUsingProfile(pProfile);  
  if (FAILED(hr))
  {
   TRACE(TEXT("Failed to ConfigureFilterUsingProfileGuid ! hr=0x%x"), hr);
   return hr;

}


2、自定义

HRESULT   CMyAmCapDlg::ConfigAsfWriter (CComQIPtr<IConfigAsfWriter> pConfig)
{
	
	int nWidth = 1024,nHeight = 768; //设置它的高与宽

	HRESULT hr;
	CComQIPtr<IWMProfile> pProfile;
	hr = pConfig->GetCurrentProfile( &pProfile );


	//删除多余的其它流数据,否则会出错
	DWORD nStreamCount;
	hr = pProfile->GetStreamCount(&nStreamCount);


	CComQIPtr<IWMStreamConfig> pStreamConfig;
	hr = pProfile->GetStream(1, &pStreamConfig); //因为应该只有一个流,所以获取视频流的
	//ERRORBOX(hr);

	pStreamConfig->SetBitrate(4096*1000);
	/设置视频流的属性
	CComQIPtr<IWMMediaProps> pMediaProps;
	pMediaProps = pStreamConfig;
	ASSERT (!!pMediaProps);
	//WM_MEDIA_TYPE *pType = reinterpret_cast<WM_MEDIA_TYPE *>( &mt );

	WM_MEDIA_TYPE *mediaType;
	DWORD bufsize;
	pMediaProps->GetMediaType(NULL,&bufsize);
	BYTE *pBuf = new BYTE[bufsize];
	mediaType = (WM_MEDIA_TYPE*) pBuf;
	pMediaProps->GetMediaType(mediaType,&bufsize);

	VIDEOINFOHEADER *pVih =  reinterpret_cast<VIDEOINFOHEADER*>(mediaType->pbFormat);

	pVih->bmiHeader.biWidth =  nWidth;
	pVih->bmiHeader.biHeight =  nHeight;
	pVih->bmiHeader.biSizeImage  = GetBitmapSize(&pVih->bmiHeader);
	pVih->dwBitRate = 4096*1000;
	mediaType->lSampleSize = pVih->bmiHeader.biSizeImage;
	
	RECT src = {0,0,pVih->bmiHeader.biWidth,pVih->bmiHeader.biHeight};
	pVih->rcSource = src;
	pVih->rcTarget = src;

	hr = pMediaProps->SetMediaType (mediaType);


	hr = pProfile->ReconfigStream (pStreamConfig);


	hr = pConfig->ConfigureFilterUsingProfile(pProfile);

	delete []pBuf;
注意
pStreamConfig->SetBitrate(4096*1000);
pVih->dwBitRate = 4096*1000;
都要设置且要相同。

参考了 http://blog.csdn.net/meuck/article/details/1211831


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值