DirectShow如何设置压缩比特率

Ginie 2011-08-07 04:07:03
我已经写好了压缩,现在压缩出来的有点厉害,1分钟生成的avi才6M多,因为我要做的是高清录制,至少要1分钟60M,我用如下代码设置了压缩的参数,但是感觉设置了没有用一样

HRESULT ret =NULL;
IPin * pSourceOut = NULL;
IPin* pCompressIn,* pCompressOut;
pCompressIn = FindPin(pCompress,PINDIR_INPUT) ;
pCompressOut = FindPin(pCompress,PINDIR_OUTPUT);
IAMVideoCompression * pAMCompress = NULL;
IAMStreamConfig *pStreamConfig = NULL;
AM_MEDIA_TYPE *pmt;
m_pCapture->FindInterface(NULL,NULL,m_pBF,IID_IAMStreamConfig,(void**)&pStreamConfig);
pStreamConfig-> GetFormat(&pmt);
if (pmt-> formattype == FORMAT_VideoInfo)
{
((VIDEOINFOHEADER *)(pmt-> pbFormat))-> dwBitRate = 20000;
pStreamConfig-> SetFormat(pmt);
}
FreeMediaType(*pmt);
pStreamConfig-> QueryInterface(IID_IAMVideoCompression, (void **)&pAMCompress);
pCompressOut->QueryInterface(IID_IAMVideoCompression,(void**)&pAMCompress);
HRESULT hret;
hret = pAMCompress->put_KeyFrameRate(10);
// hret = pAMCompress->put_Quality(1.0);
pStreamConfig-> Release();
pAMCompress->Release();
...全文
269 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ginie 2011-08-08
  • 打赏
  • 举报
回复
那个是我注释错了,我上面定义是这样的
#define IMAGE_WIDTH 1600
#define IMAGE_HEIGHT 1200
是1600×1200的
ArcRain 2011-08-08
  • 打赏
  • 举报
回复
额。。。你采集的分辨率大小是176x144?那这样出来的数据量可能是会小些的。
另外,我找了篇类似的帖子,不知道能不能解决你的问题,先看看吧。
http://topic.csdn.net/u/20080827/17/8b2dcced-316f-4b9d-80f6-e4776931ec73.html
Ginie 2011-08-08
  • 打赏
  • 举报
回复
顶一下,如何设置DirectShow的压缩质量呀。
Ginie 2011-08-08
  • 打赏
  • 举报
回复
我现在改成这样了还是不行

IAMVideoCompression * pAMCompress = NULL; //压缩参数设置
IAMStreamConfig *pStreamConfig = NULL; //压缩参数设置
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
hr = m_pGrabber->SetMediaType(&mt);
m_pCapture->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF,IID_IAMStreamConfig,(void**)&pStreamConfig);
//设置自己的视频格式
AM_MEDIA_TYPE * pMediaType = NULL;
hr = pStreamConfig->GetFormat(&pMediaType);
VIDEOINFOHEADER * pvih = (VIDEOINFOHEADER*) pMediaType->pbFormat;//这个视频好像是16位的
pvih->bmiHeader.biBitCount = 24;
pvih->bmiHeader.biWidth= IMAGE_WIDTH ; //修改采集视频的宽为176
pvih->bmiHeader.biHeight= IMAGE_HEIGHT ; //修改采集视频的高为144
pvih->bmiHeader.biSizeImage = IMAGE_WIDTH * IMAGE_HEIGHT *3 ;
pMediaType->lSampleSize = pvih->bmiHeader.biSizeImage;
pMediaType->pbFormat = (BYTE*) pvih;
pStreamConfig->SetFormat(pMediaType); //重新设置参数

pCompressIn = FindPin(pCompress,PINDIR_INPUT) ; //查找输入引脚
pCompressOut = FindPin(pCompress,PINDIR_OUTPUT); //查找输出引脚
pStreamConfig-> QueryInterface(IID_IAMVideoCompression, (void **)&pAMCompress);
pCompressOut->QueryInterface(IID_IAMVideoCompression,(void**)&pAMCompress);
HRESULT hret;
hret = pAMCompress->put_KeyFrameRate(10);
// hret = pAMCompress->put_Quality(1.0);

pStreamConfig-> Release();
pAMCompress->Release();
Ginie 2011-08-08
  • 打赏
  • 举报
回复
我决定不搞这个问题,继续钻研下面的功能,呵呵,先结贴
Ginie 2011-08-08
  • 打赏
  • 举报
回复
还是不行呢,根据你提供的网站进行了修改,还是没有变化呢。
Ginie 2011-08-08
  • 打赏
  • 举报
回复
是这样的,因为我用的摄像头是医院的高清显微镜的,所以采集的时候必须是高清才行,我用正常的USB的摄像头的话1分钟采集的才4M多,用那个显微镜的是6M多,我要使得压缩比例差不多是2分钟60M左右才行,那样效果才比较清楚,这样的要怎么设置才行呀
ArcRain 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 g6785654 的回复:]

那个是我注释错了,我上面定义是这样的
#define IMAGE_WIDTH 1600
#define IMAGE_HEIGHT 1200
是1600×1200的
[/Quote]

这个,就像我找的帖子里说的,采集的分辨率只能根据摄相头硬件支持的分辨率范围来调整,也就说,你只能使用摄相头支持的分辨率来采集。
你现在保存出来的视频分辨率是多大的?
Ginie 2011-08-07
  • 打赏
  • 举报
回复
请问输出分辨率是用哪个参数设置的?请问输出分辨率是用哪个参数设置的?
ArcRain 2011-08-07
  • 打赏
  • 举报
回复
你设置的输出视频分辨率是多大的?如果分辨率小的话,可能会小点。
dwBitRate的单位是比特/秒,换成KBytes/s大概码流有1125KBytes/s.也许可以再设置高点。
Ginie 2011-08-07
  • 打赏
  • 举报
回复

pEnumCat->Release();
pMoniker->Release();
m_pGB->AddFilter(pCompress,L"Compressor"); //添加过滤器
HRESULT ret =NULL;
IPin * pSourceOut = NULL;
IPin* pCompressIn,* pCompressOut;
IAMVideoCompression * pAMCompress = NULL; //压缩参数设置
IAMStreamConfig *pStreamConfig = NULL; //压缩参数设置
AM_MEDIA_TYPE *pmt;
m_pCapture->FindInterface(NULL,NULL,m_pBF,IID_IAMStreamConfig,(void**)&pStreamConfig);
pStreamConfig-> GetFormat(&pmt);
if (pmt-> formattype == FORMAT_VideoInfo)
{
((VIDEOINFOHEADER *)(pmt-> pbFormat))-> dwBitRate = 9000000;
pStreamConfig-> SetFormat(pmt);
}
pCompressIn = FindPin(pCompress,PINDIR_INPUT) ; //查找输入引脚
pCompressOut = FindPin(pCompress,PINDIR_OUTPUT); //查找输出引脚

FreeMediaType(*pmt);
pStreamConfig-> QueryInterface(IID_IAMVideoCompression, (void **)&pAMCompress);
pCompressOut->QueryInterface(IID_IAMVideoCompression,(void**)&pAMCompress);
HRESULT hret;
hret = pAMCompress->put_KeyFrameRate(10);
// hret = pAMCompress->put_Quality(1.0);
pStreamConfig-> Release();
pAMCompress->Release();
Ginie 2011-08-07
  • 打赏
  • 举报
回复
有变化了,但是变化很小,原来6M,现在8M,我把 ((VIDEOINFOHEADER *)(pmt-> pbFormat))-> dwBitRate = 9000000; 改成那么大了,才大一点点,麻烦你了,知道是什么原因么
ArcRain 2011-08-07
  • 打赏
  • 举报
回复
试着在连接各个PIN之前设置看看,因为一般连上了PIN之后再去设置,可能会没有效果的。

16,470

社区成员

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

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

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