CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  多媒体/流媒体开发

如何修改profile 达到修改屏幕大小呢?

楼主benjiam(今晚打老虎)2006-09-04 16:04:10 在 专题开发/技术/项目 / 多媒体/流媒体开发 提问

保存asf   文件的时候  
  if(pConfigAsfWriter   )  
          {  
                  CComPtr   <IWMProfile   >   pProfile;  
  CComPtr   <IWMStreamConfig   >   ppConfig;  
  CComPtr   <IWMMediaProps>   pMediaProps;  
   
                  //hr   =   MapProfileIdToProfile(iProfile,   &pProfile);  
                  if(FAILED(hr))   {                
  return   hr;  
                  }  
   
  pConfigAsfWriter->GetCurrentProfile(&pProfile);  
     
  pProfile->GetStream(0,&ppConfig);  
   
  ppConfig->QueryInterface(IID_IWMMediaProps,(void**)(&pMediaProps));  
   
  WM_MEDIA_TYPE   mediaType;  
  DWORD   bufsize;  
  //pMediaProps->GetMediaType(NULL,&bufsize);  
  pMediaProps->GetMediaType(&mediaType,&bufsize);  
   
                  //   note   that   the   ASF   writer   will   not   run   if   the   number   of   streams  
                  //   does   not   match   the   profile.  
                  hr   =   pConfigAsfWriter->ConfigureFilterUsingProfile(pProfile);  
                  if(FAILED(hr))   {  
                          return   hr;  
                  }  
   
   
  }  
   
  pMediaProps->GetMediaType(&mediaType,&bufsize);  
   
  只要用到了   就会在释放智能指针的时候出错!  
   
  这是以前别人的代码  
   
  aoosang(智慧的鱼)   于   2005-2-1   9:03:50    
   
  IWMProfile   *ppProfile;  
  pAsfConfig->GetCurrentProfile   (&ppProfile);  
   
  IWMStreamConfig*   ppConfig;    
  ppProfile->GetStream(0,&ppConfig);   //获取视频流的  
  /////设置视频流的属性  
  IWMMediaProps   *pMediaProps;  
  ppConfig->QueryInterface(IID_IWMMediaProps,(void**)(&pMediaProps));  
  WM_MEDIA_TYPE   mediaType;  
  DWORD   bufsize;  
  pMediaProps->GetMediaType(NULL,&bufsize);  
  pMediaProps->GetMediaType(&mediaType,&bufsize);  
   
  VIDEOINFOHEADER   *pVih   =   reinterpret_cast<VIDEOINFOHEADER*>(mediaType.pbFormat);  
   
  //   在这里重新设置视频流的属性    
  pVih->bmiHeader.biWidth=1024;  
  pVih->bmiHeader.biHeight=768;    
  pMediaProps->SetMediaType(&mediaType);  
   
   
  陆兄看看上面设置图像的大小的一段代码是否正确?  
  pVih->bmiHeader.biWidth=1024;  
  pVih->bmiHeader.biHeight=768;    
     
   
   
  我感觉没错  
   
  但是不行啊!  
  问题点数:100、回复次数:29Top

1 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-04 17:30:05 得分 0

可能是你没在GetMediaType中分配内存。最近我也在做这个,下面是调通的部分代码:  
  /////设置视频流的属性  
  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);  
  VIDEOINFOHEADER   *pVih2   =   reinterpret_cast<VIDEOINFOHEADER*>(pType->pbFormat);  
   
  //memcpy   (pVih,pVih2,sizeof(VIDEOINFOHEADER));  
  pVih->bmiHeader.biWidth   =     pVih2->bmiHeader.biWidth;  
  pVih->bmiHeader.biHeight   =     pVih2->bmiHeader.biHeight;  
  mediaType->lSampleSize   =   pType->lSampleSize;  
  RECT   src   =   {0,0,pVih->bmiHeader.biWidth,pVih->bmiHeader.biHeight};  
  pVih->rcSource   =   src;  
  pVih->rcTarget   =   src;  
   
   
   
  hr   =   pMediaProps->SetMediaType   (mediaType);  
  ERROR_BOX2(hr);  
   
  hr   =   pProfile->ReconfigStream   (pStreamConfig);  
  ERROR_BOX2(hr);  
   
  hr   =   pConfig->ConfigureFilterUsingProfile(pProfile);  
  ERROR_BOX2(hr);  
  delete   []pBuf;  
  return   hr;Top

2 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-04 17:32:00 得分 0

上面的pType   是从其它地方得到的信息,主要是这几行会用到而已:  
  pVih->bmiHeader.biWidth   =     pVih2->bmiHeader.biWidth;  
  pVih->bmiHeader.biHeight   =     pVih2->bmiHeader.biHeight;  
  mediaType->lSampleSize   =   pType->lSampleSize;  
  RECT   src   =   {0,0,pVih->bmiHeader.biWidth,pVih->bmiHeader.biHeight};  
  pVih->rcSource   =   src;  
  pVih->rcTarget   =   src;Top

3 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-04 17:33:53 得分 0

还有一点要记住,就是如果你用的AsfWriter修改了文件名。必须在修改后重新设置一下profile.Top

4 楼benjiam(今晚打老虎)回复于 2006-09-04 17:47:26 得分 0

谢谢   谢谢!  
   
  下去试试Top

5 楼benjiam(今晚打老虎)回复于 2006-09-04 17:59:47 得分 0

pType     的mt  
  从那里获得呢?  
   
   
  目前我的代码  
   
  CComPtr   <IWMProfile   >   pProfile;  
  CComPtr   <IWMStreamConfig   >   ppConfig;  
   
  pConfigAsfWriter->GetCurrentProfile(&pProfile);  
  pProfile->GetStream(0,&ppConfig);   //获取视频流的  
   
  CComQIPtr<IWMMediaProps>   pMediaProps;  
  ppConfig->QueryInterface(IID_IWMMediaProps,(void**)(&pMediaProps));  
  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);  
  VIDEOINFOHEADER   *pVih2   =   reinterpret_cast<VIDEOINFOHEADER*>(pType->pbFormat);  
   
  //memcpy   (pVih,pVih2,sizeof(VIDEOINFOHEADER));  
  pVih->bmiHeader.biWidth   =     pVih2->bmiHeader.biWidth;  
  pVih->bmiHeader.biHeight   =     pVih2->bmiHeader.biHeight;  
  mediaType->lSampleSize   =   pType->lSampleSize;  
  RECT   src   =   {0,0,pVih->bmiHeader.biWidth,pVih->bmiHeader.biHeight};  
  pVih->rcSource   =   src;  
  pVih->rcTarget   =   src;  
   
   
   
  hr   =   pMediaProps->SetMediaType   (mediaType);  
  // ERROR_BOX2(hr);  
   
  hr   =   pProfile->ReconfigStream   (ppConfig);  
  //ERROR_BOX2(hr);  
   
  hr   =   pConfigAsfWriter->ConfigureFilterUsingProfile(pProfile);  
  //ERROR_BOX2(hr);  
  delete   []pBuf;  
  if(FAILED(hr))   {  
                          return   hr;  
                  } Top

6 楼benjiam(今晚打老虎)回复于 2006-09-04 20:55:53 得分 0

AM_MEDIA_TYPE   mtGroup;  
  ZeroMemory(&mtGroup,   sizeof(AM_MEDIA_TYPE));  
  mtGroup.majortype   =   MEDIATYPE_Video;  
   
   
  mtGroup.subtype   =   MEDIASUBTYPE_RGB555;  
   
  //   Set   format   headers.  
  mtGroup.pbFormat   =   (BYTE*)CoTaskMemAlloc(sizeof(VIDEOINFOHEADER));  
  if   (mtGroup.pbFormat   ==   NULL)  
  {  
  return   E_OUTOFMEMORY;  
  }  
   
  VIDEOINFOHEADER   *pVideoHeader   =   (VIDEOINFOHEADER*)mtGroup.pbFormat;  
  ZeroMemory(pVideoHeader,   sizeof(VIDEOINFOHEADER));  
  pVideoHeader->bmiHeader.biBitCount   =   16;  
  pVideoHeader->bmiHeader.biWidth   =   1024;  
  pVideoHeader->bmiHeader.biHeight   =   768;  
  pVideoHeader->bmiHeader.biPlanes   =   1;  
  pVideoHeader->bmiHeader.biSize   =   sizeof(BITMAPINFOHEADER);  
  pVideoHeader->bmiHeader.biSizeImage   =   DIBSIZE(pVideoHeader->bmiHeader);  
   
  //   Set   the   format   type   and   size.  
  mtGroup.formattype   =   FORMAT_VideoInfo;  
  mtGroup.cbFormat   =   sizeof(VIDEOINFOHEADER);  
   
  //   Set   the   sample   size.  
  mtGroup.bFixedSizeSamples   =   TRUE;  
  mtGroup.lSampleSize   =   DIBSIZE(pVideoHeader->bmiHeader);  
   
   
   
  HRESULT   hr;  
  CComQIPtr<IWMProfile>   pProfile;  
  hr   =   pConfigAsfWriter->GetCurrentProfile(   &pProfile   );  
  //ERROR_BOX2(hr);  
   
  CComQIPtr<IWMStreamConfig>   pStreamConfig;  
  hr   =   pProfile->GetStream(1,   &pStreamConfig);   //获取视频流的  
  //ERROR_BOX2(hr);  
   
   
  /////设置视频流的属性  
  CComQIPtr<IWMMediaProps>   pMediaProps;  
  pMediaProps   =   pStreamConfig;  
  ASSERT   (!!pMediaProps);  
  WM_MEDIA_TYPE   *pType   =   reinterpret_cast<WM_MEDIA_TYPE   *>(   &mtGroup   );  
   
  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);  
  VIDEOINFOHEADER   *pVih2   =   reinterpret_cast<VIDEOINFOHEADER*>(pType->pbFormat);  
   
  //memcpy   (pVih,pVih2,sizeof(VIDEOINFOHEADER));  
  pVih->bmiHeader.biWidth   =     pVih2->bmiHeader.biWidth;  
  pVih->bmiHeader.biHeight   =     pVih2->bmiHeader.biHeight;  
  mediaType->lSampleSize   =   pType->lSampleSize;  
  RECT   src   =   {0,0,pVih->bmiHeader.biWidth,pVih->bmiHeader.biHeight};  
  pVih->rcSource   =   src;  
  pVih->rcTarget   =   src;  
   
   
   
  hr   =   pMediaProps->SetMediaType   (mediaType);  
  //ERROR_BOX2(hr);  
   
  hr   =   pProfile->ReconfigStream   (pStreamConfig);  
  //ERROR_BOX2(hr);  
   
  //删除多余的其它流数据,否则会出错  
  hr   =   pProfile->RemoveStreamByNumber(1);  
  //ERROR_BOX2(hr);  
   
   
  hr   =   pConfigAsfWriter->ConfigureFilterUsingProfile(pProfile);  
  //ERROR_BOX2(hr);  
  return   hr;  
   
   
  //   Clean   up.  
  CoTaskMemFree(mtGroup.pbFormat);  
   
  if(FAILED(   hr   ))    
          {                  
                  return   hr;  
          }Top

7 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-04 23:43:01 得分 0

pType   中的mt   我是直接从数据源那里获得的(因为数据源也是我自已写的,所以我就偷懒从里面直接导出来)。        
   
  它的构造可以参考   DirectShow   的例子"Bouning   ball"   Source   Filter.  
  它里面实现的GetMediaType,就是构造mt的方法。  
   
  其实mt不是必须的。不过关键的各部分因该同AM_MEDIA_TYPE   都是一样的。    
   
  而且其中关键的几个如:  
  mediaType->lSampleSize   也应该与它的象素大小有关(bmiHeader.biBitCount)。  
   
   
   
  Top

8 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-04 23:45:19 得分 0

由于我的需要的其它信息与其默认的很多地方有相同,比如都是RGB24。所以有些信息并没有改:  
   
  下面是在网上其它人说的,可以参考一下:  
  改了长宽之后WM_MEDIA_TYPE的lSampleSize;WMVIDEOINFOHEADER的rcSource,rcTarget,dwBitRate和bmiHeader应该都要改Top

9 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-04 23:48:11 得分 0

由于我写的DirectShow   程序是使用默认的profile,有点担心是不是每台机器默认的profile都是一样的?  
   
  所以我打算还是自已写一个profile或者把现在使用的profile用CLSID指定下来,然后再用代码修改。  
   
  Top

10 楼benjiam(今晚打老虎)回复于 2006-09-05 09:06:00 得分 0

我现在修改了以后没有   什么用  
   
  下面是在网上其它人说的,可以参考一下:  
  改了长宽之后WM_MEDIA_TYPE的lSampleSize;WMVIDEOINFOHEADER的rcSource,rcTarget,dwBitRate和bmiHeader应该都要改  
  我也看到了。   目前还是没有结果Top

11 楼benjiam(今晚打老虎)回复于 2006-09-05 09:09:57 得分 0

我的程序在一开始   也设置过   media   type   成功了  
   
  代码如下    
   
  CComQIPtr<   IAMTimelineGroup,   &IID_IAMTimelineGroup   >   pVideoGroup(   pVideoGroupObj   );  
   
  /*  
          AM_MEDIA_TYPE   mtGroup;      
          ZeroMemory(&mtGroup,   sizeof(AM_MEDIA_TYPE));  
          mtGroup.majortype   =   MEDIATYPE_Video;  
          //pGroup->SetMediaType(&mtGroup);  
   
          //   all   we   set   is   the   major   type.   The   group   will   automatically   use   other   defaults    
  //   我们会只设定group的主id   系统会自己设定其他的参数  
          //VideoGroupType.SetType(   &mtGroup   );  
          hr   =   pVideoGroup->SetMediaType(   &mtGroup);  
          */  
   
  AM_MEDIA_TYPE   mtGroup;  
  ZeroMemory(&mtGroup,   sizeof(AM_MEDIA_TYPE));  
  mtGroup.majortype   =   MEDIATYPE_Video;  
   
   
  mtGroup.subtype   =   MEDIASUBTYPE_RGB555;  
   
  //   Set   format   headers.  
  mtGroup.pbFormat   =   (BYTE*)CoTaskMemAlloc(sizeof(VIDEOINFOHEADER));  
  if   (mtGroup.pbFormat   ==   NULL)  
  {  
  return   E_OUTOFMEMORY;  
  }  
   
  VIDEOINFOHEADER   *pVideoHeader   =   (VIDEOINFOHEADER*)mtGroup.pbFormat;  
  ZeroMemory(pVideoHeader,   sizeof(VIDEOINFOHEADER));  
  pVideoHeader->bmiHeader.biBitCount   =   16;  
  pVideoHeader->bmiHeader.biWidth   =   1024;  
  pVideoHeader->bmiHeader.biHeight   =   768;  
  pVideoHeader->bmiHeader.biPlanes   =   1;  
  pVideoHeader->bmiHeader.biSize   =   sizeof(BITMAPINFOHEADER);  
  pVideoHeader->bmiHeader.biSizeImage   =   DIBSIZE(pVideoHeader->bmiHeader);  
   
  //   Set   the   format   type   and   size.  
  mtGroup.formattype   =   FORMAT_VideoInfo;  
  mtGroup.cbFormat   =   sizeof(VIDEOINFOHEADER);  
   
  //   Set   the   sample   size.  
  mtGroup.bFixedSizeSamples   =   TRUE;  
  mtGroup.lSampleSize   =   DIBSIZE(pVideoHeader->bmiHeader);  
   
  //   Now   use   this   media   type   for   the   group.  
  pVideoGroup->SetMediaType(&mtGroup);  
   
  //   Clean   up.  
  CoTaskMemFree(mtGroup.pbFormat);  
   
  if(FAILED(   hr   ))    
          {                  
                  return   hr;  
          }  
   
  我想现在也应该可以吧  
  Top

12 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-05 11:05:55 得分 0

我也是初学者,所以不知道可不可以.  
  但是,你的目的不就是改个屏幕布大小吗?  
  所以还是以直接从IWMMediaProps得到结构进行修改.我知道我这边只要再改下lSampleSize就OK了.  
   
  我生成一个AM_MEDIA_TYPE的结构的主要目的是方便得得如:bFixedSizeSamples   这类的数据.  
   
  另外你生成的AM_MEDIA_TYPE使用的是   MEDIASUBTYPE_RGB555,应该从IWMMediaProps得到的  
  subtype   比较容易成功吧.  
   
  所以没必要把整个AM_MEDIA_TYPE都填好.  
   
   
   
  Top

13 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-05 11:11:26 得分 0

另外,我之所以用AM_MEDIA_TYPE是因为有个CMediaType这个类可以用,而CMediaType与  
  AM_MEDIA_TYPE在二进制上是一致的,而WM_MEDIA_TYPE又与AM_MEDIA_TYP是一致的,所以  
  其指针可以相互转换。下面是DIRECT   SHOW   SDK中生成一个CMediaType的例子,我不知道你的方法是否正确,但是下面的代码则一定是正确的。  
  HRESULT   CBallStream::GetMediaType(int   iPosition,   CMediaType   *pmt)  
  {  
          CheckPointer(pmt,E_POINTER);  
   
          CAutoLock   cAutoLock(m_pFilter->pStateLock());  
          if(iPosition   <   0)  
          {  
                  return   E_INVALIDARG;  
          }  
   
          //   Have   we   run   off   the   end   of   types?  
   
          if(iPosition   >   4)  
          {  
                  return   VFW_S_NO_MORE_ITEMS;  
          }  
   
          VIDEOINFO   *pvi   =   (VIDEOINFO   *)   pmt->AllocFormatBuffer(sizeof(VIDEOINFO));  
          if(NULL   ==   pvi)  
                  return(E_OUTOFMEMORY);  
   
          ZeroMemory(pvi,   sizeof(VIDEOINFO));  
   
          switch(iPosition)  
          {  
                  case   0:  
                  {          
                          //   Return   our   highest   quality   32bit   format  
   
                          //   since   we   use   RGB888   (the   default   for   32   bit),   there   is  
                          //   no   reason   to   use   BI_BITFIELDS   to   specify   the   RGB  
                          //   masks.   Also,   not   everything   supports   BI_BITFIELDS  
   
                          SetPaletteEntries(Yellow);  
                          pvi->bmiHeader.biCompression   =   BI_RGB;  
                          pvi->bmiHeader.biBitCount         =   32;  
                          break;  
                  }  
   
                  case   1:  
                  {       //   Return   our   24bit   format  
   
                          SetPaletteEntries(Green);  
                          pvi->bmiHeader.biCompression   =   BI_RGB;  
                          pvi->bmiHeader.biBitCount         =   24;  
                          break;  
                  }  
   
                  case   2:  
                  {                
                          //   16   bit   per   pixel   RGB565  
   
                          //   Place   the   RGB   masks   as   the   first   3   doublewords   in   the   palette   area  
                          for(int   i   =   0;   i   <   3;   i++)  
                                  pvi->TrueColorInfo.dwBitMasks[i]   =   bits565[i];  
   
                          SetPaletteEntries(Blue);  
                          pvi->bmiHeader.biCompression   =   BI_BITFIELDS;  
                          pvi->bmiHeader.biBitCount         =   16;  
                          break;  
                  }  
   
                  case   3:  
                  {       //   16   bits   per   pixel   RGB555  
   
                          //   Place   the   RGB   masks   as   the   first   3   doublewords   in   the   palette   area  
                          for(int   i   =   0;   i   <   3;   i++)  
                                  pvi->TrueColorInfo.dwBitMasks[i]   =   bits555[i];  
   
                          SetPaletteEntries(Blue);  
                          pvi->bmiHeader.biCompression   =   BI_BITFIELDS;  
                          pvi->bmiHeader.biBitCount         =   16;  
                          break;  
                  }  
   
                  case   4:  
                  {       //   8   bit   palettised  
   
                          SetPaletteEntries(Red);  
                          pvi->bmiHeader.biCompression   =   BI_RGB;  
                          pvi->bmiHeader.biBitCount         =   8;  
                          pvi->bmiHeader.biClrUsed                 =   iPALETTE_COLORS;  
                          break;  
                  }  
          }  
   
          //   (Adjust   the   parameters   common   to   all   formats...)  
   
          //   put   the   optimal   palette   in   place  
          for(int   i   =   0;   i   <   iPALETTE_COLORS;   i++)  
          {  
                  pvi->TrueColorInfo.bmiColors[i].rgbRed             =   m_Palette[i].peRed;  
                  pvi->TrueColorInfo.bmiColors[i].rgbBlue           =   m_Palette[i].peBlue;  
                  pvi->TrueColorInfo.bmiColors[i].rgbGreen         =   m_Palette[i].peGreen;  
                  pvi->TrueColorInfo.bmiColors[i].rgbReserved   =   0;  
          }  
   
          pvi->bmiHeader.biSize               =   sizeof(BITMAPINFOHEADER);  
          pvi->bmiHeader.biWidth             =   m_iImageWidth;  
          pvi->bmiHeader.biHeight           =   m_iImageHeight;  
          pvi->bmiHeader.biPlanes           =   1;  
          pvi->bmiHeader.biSizeImage     =   GetBitmapSize(&pvi->bmiHeader);  
          pvi->bmiHeader.biClrImportant   =   0;  
   
          SetRectEmpty(&(pvi->rcSource));   //   we   want   the   whole   image   area   rendered.  
          SetRectEmpty(&(pvi->rcTarget));   //   no   particular   destination   rectangle  
   
          pmt->SetType(&MEDIATYPE_Video);  
          pmt->SetFormatType(&FORMAT_VideoInfo);  
          pmt->SetTemporalCompression(FALSE);  
   
          //   Work   out   the   GUID   for   the   subtype   from   the   header   info.  
          const   GUID   SubTypeGUID   =   GetBitmapSubtype(&pvi->bmiHeader);  
          pmt->SetSubtype(&SubTypeGUID);  
          pmt->SetSampleSize(pvi->bmiHeader.biSizeImage);  
   
          return   NOERROR;  
   
  }   //   GetMediaTypeTop

14 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-05 11:15:15 得分 0

另外你也可以参考我BLOG中的一点信息:  
  http://blog.csdn.net/Meuck/archive/2006/08/31/1150700.aspx  
   
  里面的ERROR_BOX则是一个宏:  
  void   ErrorMsgBox(HRESULT   hr,const   char   *filename,const   int   &line)  
  {  
  _com_error   err(hr);  
  TCHAR   fname[MAX_PATH];  
  #ifdef     UNICODE  
  int   nLen   =   MultiByteToWideChar(CP_ACP,0,filename,-1,NULL,0);  
  MultiByteToWideChar   (CP_ACP,0,filename,-1,fname,nLen);  
  #else  
  strcpy   (fname,   filename);  
  #endif  
   
  TCHAR   szNew[MAX_PATH];  
  _stprintf   (szNew,_T("LINE:%d   VALUE:%x\n"),line,hr);  
  _tcscat   (szNew,   fname);  
   
   
  MessageBox(NULL,szNew,err.ErrorMessage(),MB_OK);  
  ASSERT(FALSE);  
  }  
   
  #define   ERROR_BOX(hr)   \  
  if   (FAILED(hr)){   ErrorMsgBox(hr,__FILE__,__LINE__);   return;}  
  #define   ERROR_BOX2(hr)   \  
  if   (FAILED(hr)){   ErrorMsgBox(hr,__FILE__,__LINE__);   return   hr;}Top

15 楼benjiam(今晚打老虎)回复于 2006-09-05 11:43:47 得分 0

en     谢谢   楼上这么热情的回帖  
   
  我做的   是把几个jpg   插在timeline   上面   加上声音     然后存储成一个asf  
  历经了几个阶段      
  无法插入声音    
  插入了   声音  
  播放的时候     图形很小     (   按照上面的代码   改成了1024*768)  
   
  无法保存      
  可以保存了   但只能是avi  
  现在可以保存成asf   了   但是   窗口大小是320*240  
   
  我现在只要把存储成asf   的窗口   改成1024   *768   旧可以了  
   
  我的代码   99%   都是   sdk   里面的代码copy   的  
   
  因为   profile   一直   做不好    
  我现在尝试把   GenProfile_lib   里面的代码加进来  
  我使用   这样的代码   来简单实现   我要的配置  
   
  CComPtr   <IWMProfile   >   pProfile;  
  CComPtr   <IWMStreamConfig   >   ppConfig;  
   
  pConfigAsfWriter->GetCurrentProfile(&pProfile);  
  pProfile->GetStream(0,&ppConfig);   //获取视频流的  
   
  CComQIPtr<IWMMediaProps>   pMediaProps;  
  ppConfig->QueryInterface(IID_IWMMediaProps,(void**)(&pMediaProps));  
  ASSERT   (!!pMediaProps);  
  //WM_MEDIA_TYPE   *pType   =   reinterpret_cast<WM_MEDIA_TYPE   *>(   &mt   );  
   
   
  WM_MEDIA_TYPE   *ppmtMediaType;  
  IWMCodecInfo3     *pCodecInfo3;  
  IWMProfileManager*   pProfileManager;  
                          hr   =   WMCreateProfileManager(   &pProfileManager   );  
                          if   (   FAILED(   hr   )   )  
                          {  
                                  return   hr;  
                          }  
                          assert(   pProfileManager   );  
   
                  hr   =   pProfileManager->QueryInterface(   IID_IWMCodecInfo3,   (void**)   &pCodecInfo3   );  
                  SAFE_RELEASE(   pProfileManager   );  
   
  CreateVideoMediaType(&ppmtMediaType,  
                                                                          pCodecInfo3,    
                                                                          100000,  
                                                                          30,    
                                                                          1024,    
                                                                          768,    
                                                                          16,  
                                                                          false,  
                                                                          0);  
   
   
  hr   =   pMediaProps->SetMediaType   (ppmtMediaType);  
  //ERROR_BOX2(hr);  
   
  hr   =   pProfile->ReconfigStream   (ppConfig);  
  //ERROR_BOX2(hr);  
   
  hr   =   pConfigAsfWriter->ConfigureFilterUsingProfile(pProfile);  
  //ERROR_BOX2(hr);  
  if(FAILED(hr))   {  
  return   hr;  
  }  
   
  其中    
  CreateVideoMediaType(&ppmtMediaType,  
                                                                          pCodecInfo3,    
                                                                          100000,  
                                                                          30,    
                                                                          1024,    
                                                                          768,    
                                                                          16,  
                                                                          false,  
                                                                          0);  
  还有错   所以   没成功Top

16 楼benjiam(今晚打老虎)回复于 2006-09-05 13:30:06 得分 0

现在   成了   但是   setmediatype   会出错  
   
  Top

17 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-06 15:39:59 得分 0

SetMediatype有错应该是不正常吧,我把修改后的代码贴出来,在你那里应该可以试。  
  其实早该这样了,AM_MEDIA_TYPE就不应该写在上面。是我偷懒把自已的代码直接COPY过来。  
   
   
   
  //这个CLSID就是我机器用的默认profile  
  DEFINE_GUID(CLSID_PROFIEL1,    
  0x6E2A6955,   0x81DF,   0x4943,   0xBA,   0x50,   0x68,   0xA9,   0x86,   0xA7,   0x08,   0xF6);  
  HRESULT       CTestMy::ConfigAsfWriter   (CComQIPtr<IConfigAsfWriter>   pConfig)  
  {  
  //pConfig->ConfigureFilterUsingProfileGuid(CLSID_PROFIEL1);   如果不行可以把这行加上  
  int   nWidth   =   1024,nHeight   =   768;   //设置它的高与宽  
   
  HRESULT   hr;  
  CComQIPtr<IWMProfile>   pProfile;  
  hr   =   pConfig->GetCurrentProfile(   &pProfile   );  
  ERRORBOX(hr);  
   
  //删除多余的其它流数据,否则会出错  
  DWORD   nStreamCount;  
  hr   =   pProfile->GetStreamCount(&nStreamCount);  
  ASSERT   (nStreamCount   <=   2);   //最多只能有两个接口,否则不是期望的profile  
  ERRORBOX(hr);  
  if   (nStreamCount   >   1)  
  {  
  hr   =   pProfile->RemoveStreamByNumber(1);  
  ERRORBOX(hr);  
  }  
   
  CComQIPtr<IWMStreamConfig>   pStreamConfig;  
  hr   =   pProfile->GetStream(0,   &pStreamConfig);   //因为应该只有一个流,所以获取视频流的  
  ERRORBOX(hr);  
   
   
  /////设置视频流的属性  
  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);  
   
  mediaType->lSampleSize   =   pVih->bmiHeader.biSizeImage;   //GetBitmapSize(&pVih->bmiHeader);//nWidth   *   nHeight   *   pVih->bmiHeader.biBitCount   /   8;                                                   //pType->lSampleSize;  
  RECT   src   =   {0,0,pVih->bmiHeader.biWidth,pVih->bmiHeader.biHeight};  
  pVih->rcSource   =   src;  
  pVih->rcTarget   =   src;  
   
  hr   =   pMediaProps->SetMediaType   (mediaType);  
  ERRORBOX(hr);  
   
  hr   =   pProfile->ReconfigStream   (pStreamConfig);  
  ERRORBOX(hr);  
   
  hr   =   pConfig->ConfigureFilterUsingProfile(pProfile);  
  ERRORBOX(hr);  
  delete   []pBuf;  
  return   hr;  
  return   NOERROR;  
  }  
   
  Top

18 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-06 15:41:47 得分 0

只是设置屏幕大小的话,应该这四行就够了:  
  pVih->bmiHeader.biWidth   =   nWidth;  
  pVih->bmiHeader.biHeight   =   nHeight;  
  pVih->bmiHeader.biSizeImage   =   GetBitmapSize(&pVih->bmiHeader);  
  mediaType->lSampleSize   =   pVih->bmiHeader.biSizeImage;Top

19 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-06 15:56:34 得分 0

看楼主的是把问题考虑成重新生成一个WM_MEDIA_TYPE 吧?这样照理应该是可以的,不过我用其它方法没有成功过。   
   
  另外  
  1.   pProfile->GetStream(0,&ppConfig);   //默认的profile第一个是音频流吧?  
  Top

20 楼benjiam(今晚打老虎)回复于 2006-09-06 16:01:28 得分 0

我用的的确是   准备重新生成一个   WM_MEDIA_TYPE   
   
  1.   pProfile->GetStream(0,&ppConfig);   //默认的profile第一个是音频流吧?  
  是的     这个bug   我已经发现了。   目前   我用修改的系统profile   的方法在做  
   
  pVih->bmiHeader.biWidth   =   nWidth;  
  pVih->bmiHeader.biHeight   =   nHeight;  
  pVih->bmiHeader.biSizeImage   =   GetBitmapSize(&pVih->bmiHeader);  
  mediaType->lSampleSize   =   pVih->bmiHeader.biSizeImage;  
   
  不够Top

21 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-06 16:06:39 得分 0

哪里不够了?是楼主要求不够?还是说会出错?  
   
  还楼主是还要设置它的画质吗?我现在也在做这个。Top

22 楼benjiam(今晚打老虎)回复于 2006-09-06 16:33:15 得分 0

我已经解决了问题  
   
  我贴一下代码  
   
   
  主要代码  
   
  //hr   =   pConfigAsfWriter->GetCurrentProfile(&pProfile);  
  hr   =   pProfile->GetStream(1,&ppConfig);   //获取视频流的  
   
  CComQIPtr<IWMMediaProps>   pMediaProps;  
  hr   =   ppConfig->QueryInterface(IID_IWMMediaProps,(void**)(&pMediaProps));  
   
  DWORD   mediatypelen   =0;  
  hr   =   pMediaProps->GetMediaType(NULL   ,   &mediatypelen);  
  WM_MEDIA_TYPE   *pmedia;  
  pmedia   =   (WM_MEDIA_TYPE   *)new   char   [mediatypelen];  
  hr   =   pMediaProps->GetMediaType(pmedia   ,   &mediatypelen);  
  //pmedia->majortype   =   MEDIATYPE_Video;  
   
  //pmedia->subtype   =   MEDIASUBTYPE_RGB555;  
   
   
  WMVIDEOINFOHEADER   *pVideoHeader   =   (WMVIDEOINFOHEADER   *)pmedia->pbFormat;  
  pVideoHeader->bmiHeader.biBitCount   =   16;  
  pVideoHeader->bmiHeader.biWidth   =   1024;  
  pVideoHeader->bmiHeader.biHeight   =   768;  
  pVideoHeader->bmiHeader.biPlanes   =   1;  
  pVideoHeader->bmiHeader.biSize   =   sizeof(BITMAPINFOHEADER);  
  pVideoHeader->bmiHeader.biSizeImage   =   DIBSIZE(pVideoHeader->bmiHeader);  
   
  RECT   src   =   {0,0,pVideoHeader->bmiHeader.biWidth,pVideoHeader->bmiHeader.biHeight};  
  pVideoHeader->rcSource   =   src;  
  pVideoHeader->rcTarget   =   src;  
   
  //   Set   the   format   type   and   size.  
  pmedia->formattype   =   FORMAT_VideoInfo;  
  pmedia->cbFormat   =   sizeof(VIDEOINFOHEADER);  
   
  //   Set   the   sample   size.  
  pmedia->bFixedSizeSamples   =   TRUE;  
  pmedia->lSampleSize   =   DIBSIZE(pVideoHeader->bmiHeader);  
   
  hr   =   pMediaProps->SetMediaType(pmedia);  
   
  Top

23 楼benjiam(今晚打老虎)回复于 2006-09-06 16:46:52 得分 0

pVih->bmiHeader.biWidth   =   nWidth;  
  pVih->bmiHeader.biHeight   =   nHeight;  
  pVih->bmiHeader.biSizeImage   =   GetBitmapSize(&pVih->bmiHeader);  
  mediaType->lSampleSize   =   pVih->bmiHeader.biSizeImage;  
   
  不够  
   
  没有反应  
   
  我看了一下   结构rcSource  
  和   rcTarget   有height   width   接口   所以   也要设定Top

24 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-07 16:23:13 得分 0

呵呵,我忘了这几个。恭喜楼主问题解决了,最后我最后还用sdk自带的工具生成的profile。  
  不过系统xml的那种profile好象我也可以用。Top

25 楼benjiam(今晚打老虎)回复于 2006-09-07 16:38:22 得分 0

谢谢啊   你用的是sdk   那个例子生成的profile   吗?  
   
  我也用了   有点问题。   先交差吧   谢谢你的回答。  
   
  系统的profile   可以loadsystemprofile   读出来  
   
  你那个例子可以发给我看看吗?  
   
  ppmsn2005@gmail.com  
   
  Top

26 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-11 10:07:10 得分 0

系统目录下不是有个WMSysPr9.prx文件吗?里面存的就是所有的profile啊Top

27 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-11 10:50:15 得分 0

邮件已发送注意查收,另外我的联系QQ是:360347175  
  希望以后还能与你一起探讨direcshow技术。Top

28 楼Meuck(如果你相信什么,你就应当有所了解)回复于 2006-09-11 10:59:10 得分 100

另外,里面的profile,使用GenProfile.exe创建的二进制配制文件也是可以的。Top

29 楼benjiam(今晚打老虎)回复于 2006-09-15 09:59:41 得分 0

overTop

相关问题

关键词

得分解答快速导航

  • 帖主:benjiam
  • Meuck

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo