µ±Ç°Î»ÖãºÊ×Ò³ > ÀîÄȶàýÌåÍøÂçͨÐż¼Êõ
3.4.2ÓïÒô»Ø·Å
Ïà¶Ô¼Òô¶øÑÔ£¬²¥·Å¾Í¼òµ¥¶àÁË£¬Í¬ÑùÓõÄÒ»¸öCWinThread¶ÔÏóCAudioPlayÀ´ÊµÏÖ£¬²¿·ÖʵÏÖ´úÂ룺
LRESULT CAudioPlay::OnWriteSoundData(WPARAM wParam, LPARAM lParam) { //
TRACE(\
MMRESULT mmResult = FALSE; char *p=NULL;
int length=(int) wParam;
if(Playing==FALSE) return FALSE; if(length<=0)
return FALSE;
WAVEHDR *lpHdr=new WAVEHDR; if(!lpHdr)
return FALSE;
p=new char [length]; if(!p) {delete lpHdr; return FALSE;}
ZeroMemory(lpHdr,sizeof(WAVEHDR)); ZeroMemory(p,length);
CopyMemory(p,(char*)lParam,length); lpHdr->lpData=p;
lpHdr->dwBufferLength = length;
mmResult = ::waveOutPrepareHeader(m_hPlay, lpHdr, sizeof(WAVEHDR)); //Ϊ»Ø·ÅÉ豸׼±¸ÄÚ´æ¿é if(mmResult){ delete lpHdr;delete p; return mmResult;}
mmResult = ::waveOutWrite(m_hPlay, lpHdr, sizeof(WAVEHDR));//дÊý¾Ý(·ÅÒô) if(mmResult){delete lpHdr;delete p; return mmResult; }
m_Count++;
return MMSYSERR_NOERROR; }
3.5ÒôÊÓÆµ·¢ËÍÓë½ÓÊÕ
ÊÓÆµ²É¼¯²ÉÓÃAVICap´ÓÊÓÆµ²É¼¯¿¨²¶»ñÊÓÆµÍ¼Ïñ£¬µÃµ½µÄÊÇλͼÐÎʽµÄÊÓÆµÖ¡£¬È»ºóÓÃDivx±àÂëÆ÷½øÐÐѹËõ£¬Ñ¹ËõÒÔºóÐγÉÒÔ֡Ϊ¸ñʽµÄMpeg4Á÷¡£Í¨¹ýWinsockʵÏÖѹËõºóµÄÊÓÆµÊý¾ÝÔÚ¾ÖÓòÍøÖеÄʵʱ´«Ê䣬½ÓÊÕÍêµÄÊý¾Ý½»¸øDivx½âÂëÆ÷£¬ÒÔÖ¡µÄ¸ñʽ½âѹ£¬×îºóʵÏÖÊÓÆµÏÔʾ¡£ËùÒÔÌá³öÒÔ֡Ϊµ¥Î»·¢ËÍÊÓÆµÊý¾ÝÁ÷¡£ÎªÁËÔÚ½ÓÊÕ¶ËÄܹ»·½±ãµØÌáÈ¡³öÒ»Ö¡£¬Ìá³öÈç±í1ËùʾµÄ¸ñʽ×齨֡¡£ÍêÕûµÄÒ»Ö¡ÓÉ5¸ö×Ö¶Î×é³É£¬¸÷¸ö×ֶεÄÒâÒåÈçÏ£ºÖ¡¿ªÊ¼±êÖ¾£º±êÖ¾×ÅÒ»Ö¡µØ¿ªÊ¼£¬Õ¼ÓÃ4¸ö×ֽڵĿռ䣻֡´óС£º±íʾÕû¸öÖ¡µÄ´óС£¬°üÀ¨5¸ö×ֶεĴóС£¬Õ¼ÓÃ4¸ö×ֽڵĿռ䣻֡±àºÅ£º±íʾ֡µÄ˳Ðò±àºÅ£¬Õ¼ÓÃ4¸ö×ֽڵĿռ䣻֡ÀàÐÍ£º±êÖ¾´ËÖ¡ÊÇ·ñÊǹؼüÖ¡£¬Õ¼ÓÃ1¸ö×ֽڵĿռ䣻֡Êý¾Ý£º´æ·ÅѹËõºóÒ»Ö¡µÄÍêÕûÊý¾Ý¡£
3.5.1ÒôÊÓÆµ·¢ËÍÓë½ÓÊÕÄ£¿éÁ÷³Ìͼ
ÒôÊÓÆµ·¢ËÍÓë½ÓÊÕÄ£¿éÁ÷³ÌͼÈçͼ8Ëùʾ¡£
ͼ8 ÒôÊÓÆµ·¢ËÍÓë½ÓÊÕÄ£¿éÁ÷³Ìͼ
3.5.1ÒôÊÓÆµ·¢ËÍÓë½ÓÊÕ´úÂë
²»·Á¼ÙÉè´´½¨µÄÏß³ÌÃûΪsendThread£¬·¢ËÍ´úÂëÈçÏ£º while(1){
isOK=true; //×¼±¸¾ÍÐ÷
SuspendThread(sendThread); //¹ÒÆðÏß³Ì
isOK=false; //Ïß³ÌÕýÔÚ·¢ËÍÊý¾Ý int length=frameLength; //´ý·¢Êý¾Ý³¤¶È if(length<50000) {//ÅжÏÊý¾ÝÊÇ·ñÕý³£ int n=0;
int sendCount=0; while(length>0) {
n=send(sock,(char*)imageBuf+sendCount,length,0); //·¢ËÍÊý¾Ý£¬ //imageBufÊÇÖ¸Õ룬ָÏò´ý·¢Êý¾ÝÖ¡
if(n==SOCKET_ERROR) //ÍøÂç³öÏÖÒì³££¬ÔòÍ˳öÏß³Ì break; length-=n; sendCount+=n;}} }
½ÓÊÕ¶Ë´´½¨Ò»¸öÏß³ÌרÃÅÓÃÀ´Ö´ÐÐÊý¾Ý½ÓÊÕ¡£²»·Á¼ÙÉèÏß³ÌÃûΪrecThread£¬ºËÐÄ´úÂëʵÏÖÈçÏ£º
while(temp!=SOCKET_ERROR){
if(!isStart) {//Ö¡Êý¾ÝÊÇ·ñ¿ªÊ¼£¬true±íʾ¿ªÊ¼ if(endNum>3) //endNum¼Í¼µ±Ç°½ÓÊÕδ´¦ÀíµÄÊý¾Ý endNum=0;
temp=recv(clisock,(char*)(recBuf+endNum),1000,0);//´Ó»º³åÇø¶ÁÈ¡Êý¾Ý startPos=serchStr(temp+endNum); //²éÕÒÖ¡¿ªÊ¼±êÖ¾ if(startPos!=-1) { isStart=true;
endNum=temp+endNum-startPos-4;
memcpy(imageBuf,recBuf+startPos+4,endNum); //±£´æÖ¡Êý¾Ý} else{
memcpy(recBuf,recBuf+temp+endNum-3,3);//±£´æ×îºóÈý¸ö×Ö½ÚµÄÊý¾Ý endNum=3;} }
else{
if(endNum<4) {//Åж¨½ô¸ú¿ªÊ¼±êÖ¾µÄÊý¾Ý£¬Èç¹ûСÓÚ4±íʾ²»ÄÜ»ñµÃÖ¡´óС temp=recv(clisock,(char*)(recBuf),1000,0); //¶ÁÈëÊý¾Ý memcpy(imageBuf+endNum,recBuf,temp);//±£´æÊý¾Ý endNum+=temp; if(endNum<4) continue;
frameSize= *((int*)imageBuf);//»ñµÃÖ¡´óС
if(frameSize<500 || frameSize>50000) {//Òì³£´¦Àí£¨Ö¡´óС·Ç·¨£© isStart = false; //¶ªÆúÊý¾ÝÖØÐ²éÕÒÖ¡¿ªÊ¼±êÖ¾ endNum = 0; continue;}
frameSize-=endNum+4;} else{
while(frameSize>0&&temp!=SOCKET_ERROR) {//»ñµÃÍêÕûÖ¡µÄÊ£ÓàÊý¾Ýtemp=recv(clisock,(char*)(imageBuf+endNum),frameSize,0); endNum+=temp; frameSize-=temp;}
if(frameSize<=0) {//Ö¡½áÊøÖÃ룬½âѹ isStart=false; endNum=0;
deCompress();//ÅжÏÊý¾ÝµÄÓÐЧÐÔ£¬µ÷ÓÃICDecompress½øÐнâѹ}}} }
¹²·ÖÏí92ƪÏà¹ØÎĵµ