2023年12月30日发(作者:)

最新QQ摄像头MPEG4视频压缩发表:sjw阅读:277次关键字:不详字体:[大中小]{最新更新,经过测试,QQ摄像头的帧率20fps,算是不错了。实时性还可以,位率平均25k左右,完全可以网络传输,视频大小320*240,清晰度挺不错的。xvid_可以调整图像质量,数值越到位率越低,质量越差(1~31,最佳为4)}unitmain;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,DSUtil,StdCtrls,DSPack,DirectShow9,Menus,ExtCtrls,lib_xvid;typeTVideoForm=class(TForm)FilterGraph:TFilterGraph;VideoWindow:TVideoWindow;MainMenu1:TMainMenu;Devices:TMenuItem;Filter:TFilter;Image:TImage;SampleGrabber:TSampleGrabber;SnapShot:TButton;CallBack:TCheckBox;mmo1:TMemo;lbl1:TLabel;tmr1:TTimer;procedureFormCreate(Sender:TObject);procedureFormCloseQuery(Sender:TObject;varCanClose:Boolean);procedureSnapShotClick(Sender:TObject);procedureSampleGrabberBuffer(sender:TObject;SampleTime:Double;pBuffer:Pointer;BufferLen:Integer);proceduretmr1Timer(Sender:TObject);private//XVIDENCODERxvid_gbl:xvid_gbl_init_t;xvid_enc:xvid_enc_create_t;xvid_encFrame:xvid_enc_frame_t;

xvid_encStats:xvid_enc_stats_t;xVid_decode:xvid_dec_create_t;xvid_decFrame:xvid_dec_frame_t;xvid_decStats:xvid_dec_stats_t;publicprocedureOnSelectDevice(sender:TObject);end;constMaxPixelCount=65536;type//Pf24bit真彩色位图像素数据结构体pRGBTripleArray=^TRGBTripleArray;TRGBTripleArray=array[0..MaxPixelCount-1]ofTRGBTriple;varVideoForm:TVideoForm;SysDev:TSysDevEnum;FrameBuf:array[0..352*288*3]ofByte;FrameImg:array[0..352*288*3]ofByte;FrameSequece:LongWord=0;spf:TFileStream;xvid_Version:Integer;FrameByteCount:LongWord=0;CurFrame:LongWord=0;implementation{$R*.dfm}eate(Sender:TObject);vari:integer;Device:TMenuItem;beginxvid_Version:=XVID_MAKE_VERSION(1,1,0);SysDev:=(CLSID_VideoInputDeviceCategory);ilters>0thenfori:=ilters-1dobeginDevice:=(Devices);n:=s[i].FriendlyName;:=i;k:=OnSelectDevice;(Device);

end;end;ctDevice(sender:TObject);Buffered:=True;raph;:=false;r:=iker(TMenuItem(Sender).tag);:=true;withFilterGraphasICaptureGraphBuilder2dobeginRenderStream(@PIN_CATEGORY_PREVIEW,nil,FilterasIBaseFilter,SampleGrabberasIBaseFilter,VideoWindowasIbaseFilter);end;try//XVID库初始化操作xvid_n:=xvid_Version;//Version:1.1.0xvid__flags:=Word(XVID_CPU_FORCEorXVID_CPU_ASM);//0:自动检查CPU,XVID_CPU_FORCEorXVID_CPU_ASM:强制使用ASM汇编优化xvid_:=0;//调试级别//初始化编解码xvid_global(nil,XVID_GBL_INIT,@xvid_gbl,nil);//XVID编码器初始化xvid_n:=xvid_Version;//编码器参数xvid_:=XVID_GLOBAL_PACKED;//全局标志xvid_:=320;//压缩视频宽度xvid_:=240;//压缩视频高度xvid_:=3;//基本帧率/每秒=fbase*10=30xvid_:=1;//帧率增长步长,0:可变步长,>1实际增长步长xvid_e:=XVID_PROFILE_AS_L2;//压缩级别,MPEG4-ASP最高压缩级别xvid__key_interval:=0;//最大关键帧间隔xvid__drop_ratio:=0;//丢帧率;0~100xvid__bframes:=0;//是否采用B帧,一般采用I,P帧,如果1=PB帧xvid__offset:=0;xvid__ratio:=0;//创建编码器xvid_encore(nil,XVID_ENC_CREATE,@xvid_enc,nil);//初始化压缩数据帧结构xvid_n:=xvid_Version;

//---VOLFLAGSxvid__flags:=XVID_VOL_MPEGQUANTORXVID_VOL_QUARTERPELORXVID_VOL_GMC;//---VOPFLAGSxvid__flags:=XVID_VOP_INTER4VorXVID_VOP_CHROMAOPT;xvid_:=XVID_ME_HALFPELREFINE16orXVID_ME_CHROMA_PVOPorXVID_ME_ADVANCEDDIAMOND16;//运动估计xvid_:=4;//质量控制=量化参数,0~31,数值越小质量越高和码率成反比xvid__type:=XVID_TYPE_AUTO;//XVID_TYPE_AUTO=让编码器自动决定,I帧编码是关键帧,P帧编码是帧内预测//XVID解码器初始化xVid_n:=xvid_Version;xVid_:=320;xVid_:=240;//创建解码器xvid_decore(nil,XVID_DEC_CREATE,@xVid_decode,nil);spf:=('c:4',fmCreateorfmOpenReadWrite);exceptExit;end;;end;oseQuery(Sender:TObject;varCanClose:Boolean);d:=False;;raph;:=false;//关闭编解码器ifAssigned(xvid_)thenxvid_encore(xvid_,XVID_ENC_DESTROY,@xvid_enc,nil);ifAssigned(xVid_)thenxvid_decore(xVid_,XVID_DEC_DESTROY,@xvid_decode,nil);end;otClick(Sender:TObject);map();

end;GrabberBuffer(sender:TObject;SampleTime:Double;pBuffer:Pointer;BufferLen:Integer);varSpBmp:TBitmap;BmpLineData:prgbtriplearray;yCount,uCount,vCount:Integer;Row,Col:Integer;Ret:Integer;d:=True;tryxvid_eam:=@FrameBuf[0];xvid_:=BufferLen;xvid_:=XVID_CSP_BGR;//输入是rgb位图xvid_[0]:=pBuffer;//RGB位图数据,每个像素有3个字节,(R,G,B)xvid_[0]:=320*3;//每行字节数{FillChar(xvid_encStats,SizeOf(xvid_encStats),0);FillChar(xvid_decStats,SizeOf(xvid_decStats),0);xvid_n:=xvid_Version;xvid_n:=xvid_Version;}//开始压缩//Ret:=xvid_encore(xvid_,XVID_ENC_ENCODE,@xvid_encFrame,@xvid_encStats);//返回编码之后的字节Ret:=xvid_encore(xvid_,XVID_ENC_ENCODE,@xvid_encFrame,nil);//返回编码之后的字节//(FrameBuf,Ret);('Codec_num='+IntToStr(FrameSequece)+'Len='+IntToStr(Ret));Inc(FrameSequece);FrameByteCount:=FrameByteCount+Ret;//实时解码部分ifRet>0thenbegintrySpBmp:=;ormat:=pf24bit;

//初始化解码数据帧结构xvid_n:=xvid_Version;xvid_l:=0;xvid_eam:=@FrameBuf[0];//输入解压的位流xvid_:=Ret;//输入位流长度xvid_:=XVID_CSP_BGR;//色彩空间xvid_[0]:=@FrameImg[0];//解压后输出的缓冲区xvid_[0]:=320*3;//每行字节数//ret:=xvid_decore(xVid_,XVID_DEC_DECODE,@xvid_decFrame,@xvid_decStats);ret:=xvid_decore(xVid_,XVID_DEC_DECODE,@xvid_decFrame,nil);ifret>map(SpBmp,@FrameImg,320*240*3);//从解码出来的RGB缓冲区中画出原始bmp位图(0,0,SpBmp);exceptend;end;;end;endelsebeginend;exceptend;end;end;1Timer(Sender:TObject);beginCurFrame:=FrameSequece-CurFrame;n:='bytes='+IntToStr(FrameByteCountdiv1024)+'k'+IntToStr(CurFrame)+'fps';CurFrame:=FrameSequece;end;end.上一篇:符合Web标准的webUI—来源、谬误与个人理解

下一篇:实现环形缓冲区的通用类热门文章通过JNI与delphi交互2.利用客户应用程序通过远程服务器上的服务端...利用SVGActiveX3.0TypeLibrary监听...DataSet隐含功能控制用ADO访问Excel文件7.外壳搜索扩展8.判断程序是否无响应9.跟据方法名动态调用方法异步可插入协议扩展调用支持12.外壳执行操作记录器13.创建3721样式的Google搜索扩展的TService的輸入桌面切換外壳拖放控制扩展菜单扩展函数抓取屏幕图像18.用Delphi4.0直接控制封裝單元20.实现环形缓冲区的通用类推荐信息关于本站-广告服务-会员指南-联系方法E-mail::9839046(请直接说明来意)Copyright©RightsReserved