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


你可能感兴趣的:(directshow中WMV码流的设置)