Einzelnen Beitrag anzeigen

Benutzerbild von jokerfacehro
jokerfacehro

Registriert seit: 13. Feb 2007
306 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: selbstgebastelter webcam stream

  Alt 11. Feb 2010, 13:49
sooo da bin ich mal wieder

folgendes hat sich getan:

ich hol mir jetz das komprimierte und bild und verschicke es per UDP vom Client an den Server.

Der server hat die nötige prozedur zur dekomprimierung der daten.



hier mal quelltext:

Die Client Methoden:

Holen der Daten vom VideoImage

Delphi-Quellcode:
procedure TVideoImage.GetFrameData(VAR FrameData: pointer; VAR FrameDataSize: integer; VAR FourCC : cardinal; VAR Width,Height:integer);
begin
  FrameData := fImagePtr[fImagePtrIndex];
  FrameDataSize := fImagePtrSize[fImagePtrIndex];
  FourCC := fFourCC; //codec
  Width:=fWidth;
  Height:=fHeight;
end;

Verschicken der Daten

Delphi-Quellcode:
procedure TForm1.sendStream;
var MStream:TMemoryStream;
    Data:string;
    FrPointer:Pointer;
    FrSize,fWidth,fHeight,bSize:integer;
    Codec:Cardinal;
begin

  fVideoImage.GetFrameData(FrPointer,FrSize,Codec,fWidth,fHeight);

  FrSize:=FrSize+3;
  setLength(Data,8192); //#0#13#0



  try
    Move(FrPointer^,Data[1],8192);
  // Data:=IntToStr(8192);
    WebcamStream.Client.Send(Data);
  except
    end;

while FrSize>8192 do begin

  try
    Data:='';
    setLength(Data,8192);
    Move(FrPointer^,Data[1],8192);
    WebcamStream.Client.Send(Data);
  except
    end;

  FrSize:=FrSize-8192;
 end;
 
Data:='';
setLength(Data,FrSize);
try
    Move(FrPointer^,Data[1],FrSize);
    Data:=Data+#0#13#0;
    WebcamStream.Client.Send(Data);
  except
    end;
end;



Server methoden:

Empfangen der Daten

Delphi-Quellcode:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: TIdBytes; ABinding: TIdSocketHandle);
var i:integer;
      buffer,data:string;
      MStream:TMemoryStream;
      bmp:TBitmap;
begin

//MStream:=TMemoryStream.Create;

buffer:=AThread.Server.ReceiveString(-1);
data:=buffer;

while(Pos(#0#13#0,buffer)<1) do begin
buffer:=AThread.Server.ReceiveString(-1);
data:=data+buffer;
end;

//buffer

//MStream.Read(buffer,Length(buffer));
Decoder.DecodeFrame(data);

//Form2.Image1.Picture.Bitmap.LoadFromStream(MStream);

//if Pos(#0#13#0,buffer)>0 then Showmessage('okkk');

//MStream.Free;
end;


dekomprimieren der daten

Delphi-Quellcode:
procedure TDecoder.DecodeFrame(Bitmap:TBitmap;Data:String);
var fp:^string;
begin
fp:=@Data;
YUY2_to_RGB(fp,Data);

end;

Delphi-Quellcode:
procedure TDecoder.YUY2_to_RGB(pData: pointer;data:string);
// [url]http://msdn.microsoft.com/en-us/library/ms893078.aspx[/url]
// [url]http://en.wikipedia.org/wiki/YCbCr[/url]
type
  TFour = ARRAY[0..3] OF byte;
VAR
  L, X, Y : integer;
  ps : pbyte;
  pf : ^TFour;
  FrPointer:Pointer;
      FrSize,fWidth,fHeight,i:integer;
      Codec:Cardinal;
      bmp:TBitmap;
begin
bmp:=TBitmap.Create;
bmp.PixelFormat:=pf24Bit;

pf:=pData;

//fVideoImage.GetFrameData(FrPointer,FrsIze,Codec,fWidth,fHeight);
fWidth:=640;
fHeight:=480;
bmp.Width:=fWidth;
bmp.Height:=fHeight;

Showmessage(IntToStr(Length(Data)));

  PrepareTables;
  FOR Y := 0 TO bmp.Height-1 DO
    BEGIN
      ps := bmp.ScanLine[Y];
      FOR X := 0 TO (bmp.Width div 2)-1 DO
        begin
          L := ValueY_298[pf^[0]]; // HIER KOMMT DER FEHLER
          ps^ := ValueClip[(L + ValueU_516[pf^[1]] ) div 256];
          Inc(ps);
          ps^ := ValueClip[(L + ValueU_100[pf^[1]] + ValueV_208[pf^[3]]) div 256];
          Inc(ps);
          ps^ := ValueClip[(L + ValueV_409[pf^[3]]) div 256];
          Inc(ps);
          L := ValueY_298[pf^[2]];
          ps^ := ValueClip[(L + ValueU_516[pf^[1]] ) div 256];
          Inc(ps);
          ps^ := ValueClip[(L + ValueU_100[pf^[1]] + ValueV_208[pf^[3]]) div 256];
          Inc(ps);
          ps^ := ValueClip[(L + ValueV_409[pf^[3]]) div 256];
          Inc(ps);


          Inc(pf);
        end;
    END;
    Form2.Image1.Picture.Assign(bmp);
    bmp.Free;
end;


so ich hänge jetzt an der letzten funktion.
Diese berechnet das bild zurück

Die Value Arrays enthalten umrechnungszahlen für die einzelnen pixel.

der pointer pf soll auf die Data zeigen.



Das Problem ist jetzt, dass ich bei der letzten funktion ne access violation kriege, siehe Kommentar im quelltext.
Die kommt allerdings erst nach etwa dem 20. durchlauf der For schleife mit Y.

Raised exception class C000005


hat jemand ne Idee ?
"Never touch a running system administrator !"
  Mit Zitat antworten Zitat