Einzelnen Beitrag anzeigen

grizzly

Registriert seit: 10. Dez 2004
150 Beiträge
 
Delphi XE4 Professional
 
#5

AW: WebCam via Stream senden

  Alt 19. Sep 2012, 09:04
Hallo!

Mir scheint, Du verwendest meinen DirectX-Port. Der bietet eine Callback Routine an, dann kannst Du Dir den Umweg über die TPaintbox sparen.

Definiere eine Callback-Routine wie folgt:
Delphi-Quellcode:
procedure TForm1.OnNewVideoFrame(Sender : TObject; Width, Height: integer; DataPtr: pointer);
begin
  // Denkbar wäre, hier ein Busy-Flag zu testen und zu setzen.

  // So holst Du das Bitmap direkt ab:
  fVideoImage.GetBitmap(fVideoBitmap); // fVideoBitmap mußt Du Dir halt noch als TBitmap zuvor erzeugen
  // Alternativ kannst Du gleich den übergebenen Pointer verwenden:
  // Der zeigt auf die Bilddaten (in 24bit RGB oder 8bit Grau, falls "Gray8Bit" gesetzt war
  // Die Speichergröße ergibt sich aus Width*Height*3 (bzw. beim Graustufenbild ohne das *3)
  // (Da die Breiten der Videos meist durch 4 teilbar sind, muß man sich nicht darum kümmern,
  // dass bei Bildern die Scanlines auf ein Vielfaches von 4 Bytes aufgefüllt wird)

  // Hier kommt Dein Code rein zum Packen und verschicken...
  // z.B.: (ohne ZCompress zu kennen): ZCompress(MStream.memory, MStream.size, DataPtr^, Width*Height*3, ...
end;
Statt Deinem Code hier:
 fVideoImage.SetDisplayCanvas(PaintBox1.Canvas); //Brauche ich das überhaupt? Oder wie kriege ich das Bild dann in die SendStream Prcedure rein? meldest Du diesen Callback wie folgt an:
fVideoImage.OnNewVideoFrame := OnNewVideoFrame; (Du kannst natürlich die Zuweisung an die Paintbox drinlassen, dann sparst Du Dir das selber-zeichnen.)

Nebenbei:
Der Foreneintrag, auf den Du in Deinem ersten Post verweist, hatte auch das Problem mit dem Packen der Daten. Ich hatte damals schon darauf hingewiesen, dass viele WebCams ihre Daten sowieso schon gepackt schicken, und in meinem Code-Misthaufen entpackt werden, bevor sie als Bitmap weitergereicht werden.
Das wäre natürlich ein Zwischenschritt, den Du rauslassen könntest, und das Entpacken des Videoframes erst auf der Zielseite machst. Aber natürlich: Die Packqualität ist halt wieder abhängig vom Codec, und Du müßtest in meinem Code-Durcheinander eingreifen...


Gruß
Michael
  Mit Zitat antworten Zitat