各位大大~~拜託幫幫我!我想儲存圖片到c槽~run都沒問題~但是就是不能存~麻煩幫我看看有那邊不對的~給予指教~謝謝
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include
#include "MainForm.h"
#include "AudioAMU.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool OK;
bool flag;
bool DisplayLocal;
bool PlayAudioFlag=false;
COMPVARS CompressorSetting;
BITMAPINFO bitmap_input;
BITMAPINFO bitmap_output;
int AudioCount=0;
int width=320;
int height=240;
AudioAMU audioObj;
UDPbyAMU TransferObj1; // for Video SOCKET
SOCKADDR_IN remote1;
int VideoPort;
UDPbyAMU TransferObj2; // for Audio SOCKET
SOCKADDR_IN remote2;
HDC hdc1;
int AudioPort;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
OK=false;
Form1->Button1->Caption="Start";
flag=false;
Form1->Button2->Caption="Disable Local Display";
DisplayLocal=true;
Form1->RemoteAddr->Enabled=true;
Form1->Port->Enabled=true;
Form1->Quit->Enabled=false;
audioObj.AudioCapInit();
audioObj.AudioPlayInit();
}
//---------------------------------------------------------------------------
bool TForm1::CapInit()
{
CAPTUREPARMS CapParms;
int WSIZE; CapWin=capCreateCaptureWindow((LPTSTR)("Capture Window"),
(WS_CHILD|WS_VISIBLE),0,0,
width,height,Form1->Handle,0);
if(CapWin==0)
return false; OK=capDriverConnect(CapWin,0);
if(!OK)
return false; OK=capCaptureGetSetup(CapWin, long(&CapParms), sizeof(CAPTUREPARMS));
if(!OK)
return false; CapParms.dwRequestMicroSecPerFrame=66667; // 15 FPS Requested capture rate
CapParms.fLimitEnabled = false;
CapParms.fCaptureAudio = false; // NO Audio
CapParms.fMCIControl = false;
CapParms.fYield = true;
CapParms.vKeyAbort = false;
CapParms.fAbortLeftMouse = false;
CapParms.fAbortRightMouse = false; OK=capCaptureSetSetup(CapWin,long(&CapParms),sizeof(CAPTUREPARMS));
if(!OK)
return false; // Callback Function
OK=capSetCallbackOnVideoStream(CapWin,TForm1::VideoCompress);
if(!OK)
return false; WSIZE=capGetVideoFormat(CapWin,&bitmap_input,sizeof(BITMAPINFO));
if(WSIZE==0)
return false; OK=capSetVideoFormat(CapWin,&bitmap_input,sizeof(BITMAPINFO));
if(!OK)
return false; // Choose Compressor
CompressorSetting.cbSize=sizeof(COMPVARS);
while(!ICCompressorChoose(Form1->Handle,ICMF_CHOOSE_DATARATE|ICMF_CHOOSE_PREVIEW,
&(bitmap_input.bmiHeader),0,&CompressorSetting,"Compressor")); if(ICCompressBegin(CompressorSetting.hic,&bitmap_input,CompressorSetting.lpbiOut) != ICERR_OK)
return false; if(ICDecompressBegin(CompressorSetting.hic,CompressorSetting.lpbiOut,&bitmap_input) != ICERR_OK)
return false; return true;
}
//---------------------------------------------------------------------------
bool TForm1::StartCap()
{
OK=capCaptureSequenceNoFile(CapWin);
if(!OK)
return false;
else
return true;
}
//---------------------------------------------------------------------------
bool TForm1::StopCap()
{
OK=capCaptureStop(CapWin);
if(!OK)
return false;
else
return true;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK TForm1::VideoCompress(HWND CapW,LPVIDEOHDR lpVHdr)
{
LPVOID lpBit;
lpBit=lpVHdr->lpData; if(DisplayLocal)
{
Form1->Memo1->Lines->Add("DisplayLocal");
// ShowOnForm
int startX1=0;
int startY1=0;
HDRAWDIB hdd1;
////////////////
hdd1=DrawDibOpen();
hdc1=GetDC(CapW);
DrawDibBegin(hdd1,hdc1,width,height,&(bitmap_input.bmiHeader),width,height,NULL);
DrawDibRealize(hdd1,hdc1,0);
DrawDibDraw(hdd1,hdc1,startX1,startY1,width,height,
&(bitmap_input.bmiHeader),lpBit,
0,0,width,height,DDF_SAME_DRAW|DDF_SAME_HDC);
DrawDibEnd(hdd1);
ReleaseDC(CapW,hdc1);
} // Compression
char CompressBuff[300000];
DWORD param1;
DWORD param2; if(ICCompress(CompressorSetting.hic,CompressorSetting.dwFlags,
&(CompressorSetting.lpbiOut->bmiHeader),CompressBuff,
&(bitmap_input.bmiHeader),lpBit,¶m1,¶m2,
1L,0,0,NULL,NULL) == ICERR_OK)
{
Form1->Memo1->Lines->Add("Compress Success");
Form1->Memo1->Lines->Add(String("compressed image size : ")
CompressorSetting.lpbiOut->bmiHeader.biSizeImage); // UDP Socket
remote1.sin_family=AF_INET;
remote1.sin_port=htons(VideoPort);
remote1.sin_addr.s_addr=inet_addr(Form1->RemoteAddr->Text.c_str());
TransferObj1.FillSock(remote1);
int iRet=TransferObj1.UDPSend(CompressBuff,int(CompressorSetting.lpbiOut->bmiHeader.biSizeImage));
Form1->Memo1->Lines->Add(AnsiString(iRet) " Bytes Video Frame Send Success !!");
}
return (LRESULT) true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(!flag)
{
PlayAudioFlag=true;
Button1->Caption="Stop";
flag=true;
Form1->Button1->Enabled=false;
Form1->RemoteAddr->Enabled=false;
Form1->Port->Enabled=false;
Form1->Quit->Enabled=true;
VideoPort=StrToInt(Form1->Port->Text);
AudioPort=VideoPort 1; if( (TransferObj1.SockInit()==0) && (TransferObj2.SockInit()==0) )
{
Form1->Memo1->Lines->Add("Socket Initialization Success !!"); if( (TransferObj1.SockBind(VideoPort)==0) && (TransferObj2.SockBind(AudioPort)==0) )
{
Form1->Memo1->Lines->Add("Socket Bind Success !!");
WSAAsyncSelect(TransferObj1.UDP_Sock,Form1->Handle,WM_NET,FD_READ|FD_WRITE);
WSAAsyncSelect(TransferObj2.UDP_Sock,Form1->Handle,WM_NET,FD_READ|FD_WRITE);
OK=(CapInit());
if(!OK)
{
Button1->Caption="Start";
flag=false;
Form1->RemoteAddr->Enabled=true;
Form1->Port->Enabled=true;
Application->MessageBox("Error to Initialize Video Devices !!","Error",MB_OK);
}
else
{
//Start to Capture Video and Audio
OK=( (StartCap()) && (audioObj.StartCapAudio()) );
if(!OK)
{
Button1->Caption="Start";
flag=false;
Form1->RemoteAddr->Enabled=true;
Form1->Port->Enabled=true;
Application->MessageBox("Error to Capture Frames!!","Error",MB_OK);
}
}
}
else
{
Form1->Memo1->Lines->Add("Socket Bind Failure !!");
Button1->Caption="Start";
flag=false;
Form1->RemoteAddr->Enabled=true;
Form1->Port->Enabled=true;
}
}
else
{
Form1->Memo1->Lines->Add("Socket Initialization Failure !!");
Button1->Caption="Start";
flag=false;
Form1->RemoteAddr->Enabled=true;
Form1->Port->Enabled=true;
}
}
else
{
bool ok2,ok3,ok9; Form1->RemoteAddr->Enabled=true;
Form1->Port->Enabled=true;
AudioCount=0;
while(!capSetCallbackOnVideoStream(CapWin,NULL));
ok9=capDriverDisconnect(CapWin);
ok2=(ICCompressEnd(CompressorSetting.hic) == ICERR_OK);
ok3=(ICDecompressEnd(CompressorSetting.hic) == ICERR_OK); if(ok2&&ok3&&ok9)
{
TransferObj1.CloseSock();
TransferObj1.EndUDPbyAMU();
TransferObj2.CloseSock();
TransferObj2.EndUDPbyAMU();
Button1->Caption="Start";
flag=false;
}
else
{
Application->MessageBox("Cannot Close Multimedia Devices!!","Error!!",MB_OK);
Close();
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
flag=false;
// audioObj.CloseCapAudio();
// audioObj.ClosePlayAudio();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NetProc(TMessage msg)
{
int buffsize;
int startX2=350;
int startY2=0;
char DecompressBuff[300000];
switch(WSAGETSELECTEVENT(msg.LParam))
{
case FD_READ:
// Videio Frame Processing
if((SOCKET) msg.WParam==TransferObj1.UDP_Sock)
{
buffsize=TransferObj1.UDPRecv(TransferObj1.recvBuff);
Form1->Memo1->Lines->Add("Video Frame Accepted");
Form1->Memo1->Lines->Add("Video Frame Size : " AnsiString(buffsize) " Bytes"); // Decompression
if(ICDecompress(CompressorSetting.hic,ICDECOMPRESS_UPDATE,
&(CompressorSetting.lpbiOut->bmiHeader),TransferObj1.recvBuff,
&(bitmap_input.bmiHeader),DecompressBuff) == ICERR_OK)
{
Form1->Memo1->Lines->Add("Decompress Success"); // ShowOnForm
HDRAWDIB hdd2;
HDC hdc2; hdd2=DrawDibOpen();
hdc2=GetDC(Form1->Handle);
DrawDibBegin(hdd2,hdc2,width,height,&(bitmap_input.bmiHeader),width,height,NULL);
DrawDibRealize(hdd2,hdc2,0);
DrawDibDraw(hdd2,hdc2,startX2,startY2,width,height,
&(bitmap_input.bmiHeader),DecompressBuff,
0,0,width,height,DDF_SAME_DRAW|DDF_SAME_HDC);
DrawDibEnd(hdd2);
ReleaseDC(Form1->Handle,hdc2);
}
else
{
Form1->Memo1->Lines->Add("Decompress Failure");
}
}
// Audio Frame Processing
else if((SOCKET) msg.WParam==TransferObj2.UDP_Sock)
{
if(PlayAudioFlag)
{
buffsize=TransferObj2.UDPRecv(TransferObj2.recvBuff);
Form1->Memo1->Lines->Add("Audio Frame Accepted");
Form1->Memo1->Lines->Add("Audio Frame Size : " AnsiString(buffsize) " Bytes"); //find a wOutHdr which has been played to be copied
for(AudioCount = 0; AudioCount < LIST_LENGTH; AudioCount )
if(audioObj.wOutHdr[AudioCount].dwFlags & WHDR_DONE) break;
// Can't find any wOutHdr has been played. Give in it.
if(AudioCount >= LIST_LENGTH) break; memcpy(audioObj.wOutHdr[AudioCount].lpData,TransferObj2.recvBuff,buffsize);
audioObj.wOutHdr[AudioCount].dwLoops=0;
audioObj.StartPlayAudio(audioObj.wOutHdr[AudioCount]);
}
}
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(!DisplayLocal)
{
DisplayLocal=true;
Form1->Button2->Caption="Disable Local Display";
}
else
{
DisplayLocal=false;
Form1->Button2->Caption="Enable Local Display";
}
}
//--------------------------------------------------------------------------- void __fastcall TForm1::QuitClick(TObject *Sender)
{
PlayAudioFlag=false;
while(!audioObj.StopPlayAudio());
while(!audioObj.StopCapAudio());
while(!StopCap());
Form1->Button1->Enabled=true;
Form1->Quit->Enabled=false;
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender)
{
Form1->Edit1->Text = Now().FormatString("yyyymmddhhnnss") ".bmp";
String PicName = Form1->Edit1->Text;
capFileSaveDIB(hdc1,PicName.c_str());
}
//---------------------------------------------------------------------------