如何修改profile 达到修改屏幕大小呢?
保存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




