![]() |
Bitmaps als AVI-Vido / MPEG-Video speichern
In einem anderen Thread wurde kürzlich einmal die Frage gestellt, wie man einen (bewegten) Bildschirminhalt auf einem anderen PC einfängt und auf den eigenen PC überträgt (um ihn dann u.U. auch als Video zu speichern).
Dieses "als Video speichern" würde mich auch näher interessieren. KodeZwerg hatte da mal die Anmerkung gemacht: "Avi Container mit JPEGs füttern, ob nun 5FPS oder was auch immer, das ist jedenfalls relativ einfach umzusetzen und verbraucht nicht viel resourcen/bandweite." Die von Ihm genannte Komponente "Avi-Writer" konnte ich hier aber leider nicht installieren. Hat jemand dazu evtl. eine Information oder einen Link oder ein kurzes Beispiel, wie man Bitmaps, die in der Anzahl so zwischen 5 und 20 pro Sekunde zur Verfügung gestellt werden könnten, in eine AVI-Datei (oder als MPEG) Datei speichern kann? Oder ist es doch nicht so relativ einfach? |
AW: Bitmaps als AVI-Vido / MPEG-Video speichern
Die Komponente TAviWriter nutzt die avifil32.dll. Dies enthält aber nicht immer die Prozedur AVIFileInitW, sondern (bei älteren Windosen) "nur" AVIFileInit.
Eventuell reicht es aus, den Quelltext der Komponente entsprechend anzupassen. Aus
Delphi-Quellcode:
müsste dann
procedure AVIFileInit; stdcall; external 'avifil32.dll' name 'AVIFileInitW';
Delphi-Quellcode:
werden.
procedure AVIFileInit; stdcall; external 'avifil32.dll' name 'AVIFileInit';
Da AVIFileInit ohne irgendwelche Parameter aufgerufen wird, könnte es eventuell klappen. Kommt halt auf 'nen Versuch an. Doku dazu: ![]() ![]() Quelltext bmp2avi: ![]() |
AW: Bitmaps als AVI-Vido / MPEG-Video speichern
16 Jahre alt und Delphi 6. Funktioniert überraschenderweise aber anscheinend sogar noch. Verwendet die vfw.pas der JVCL. Und wohl nur als Ideengeber geeignet. Für andere Container wird es dann komplizierter.
Delphi-Quellcode:
var dir: String;
ts: TSearchRec; datlist: TStringList; tfs: TFileStream; pfile: IAVIFile; pavi: IAVIStream; psi: TAVISTREAMINFO; Bfi: BITMAPFILEHEADER; bmi: PBITMAPINFO; bits: PByteArray; i, bmisize: Integer; begin if Not SelectDirectory('Bitmapverzeichnis wählen', 'c:', dir) then Exit; if FindFirst(dir+'\*.bmp', faAnyFile, ts)<>0 then Exit; if Not SaveDialog1.Execute then Exit; datlist:=TStringList.Create; try datlist.Add(ts.Name); while FindNext(ts)=0 do datlist.Add(ts.Name); datlist.Sort; finally FindClose(ts); end; Label1.Caption:=IntToStr(datlist.Count); tfs:=TFileStream.Create(dir+'\'+datlist[0], fmOpenRead); tfs.Read(bfi, SizeOf(BITMAPFILEHEADER)); bmisize:=bfi.bfOffBits-SizeOf(BITMAPFILEHEADER); GetMem(bmi, bmisize); tfs.Read(bmi^, bmisize); GetMem(bits, bmi.bmiHeader.biSizeImage); tfs.Read(bits^, bmi^.bmiHeader.biSizeImage); AVIFileInit; AVIFileOpen(pfile, PChar(SaveDialog1.FileName), OF_CREATE OR OF_WRITE, NIL); ZeroMemory(@psi, SizeOf(TAVIStreamInfo)); with psi do begin fccType:=streamtypeVIDEO; fccHandler:=mmioFourcc(#0, 'D', 'I', 'B'); dwScale:=1; dwRate:=25; dwLength:=datlist.Count; dwSuggestedBufferSize:=bmi.bmiHeader.biSizeImage; rcFrame:=Rect(0, 0, bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight); szName:='Noname'; dwQuality:=$FFFFFFFF; dwSampleSize:=bmi.bmiHeader.biSizeImage; end; AVIFileCreateStream(pfile, pavi, psi); AVIStreamSetFormat(pavi, 0, bmi, bmisize); For i:=0 to datlist.Count-1 do begin AVIStreamWrite(pavi, i, 1, bits, bmi.bmiHeader.biSizeImage, AVIIF_KEYFRAME, NIL, NIL); tfs.Free; tfs:=TFileStream.Create(dir+'\'+datlist[i], fmOpenRead); Image1.Picture.Bitmap.LoadFromStream(tfs); tfs.Seek(bfi.bfOffBits, soFromBeginning); tfs.Read(bits^, bmi.bmiHeader.biSizeImage); Label2.Caption:=IntToStr(i+1); Application.ProcessMessages; end; tfs.Free; FreeMem(bits); datlist.Free; |
AW: Bitmaps als AVI-Vido / MPEG-Video speichern
Ich habe ein lauffähiges Demo hier in DP gefunden, also BMP2AVI, geschrieben von
![]() Für mein Delphi 2010 musste ich folgende Änderung vornehmen damit es erstmal überhaupt funktioniert, es hat noch Probleme und Speicherleks, aber die Grundsubstanz funktioniert. Datei: CreateAVI.pas Zeile: 198 ist nun:
Delphi-Quellcode:
if AVIFileOpenW(pfile, PWideChar(WideString(WorkFile)), OF_WRITE or OF_CREATE, nil) <> AVIERR_OK then
edit Ps: vorher war die Zeile
Delphi-Quellcode:
aber der Compiler hat immer die Ansi Version genommen und beim String abgekackt. Da ist wieder so was was ich nicht verstehe obwohl ja PChar und keine A/W angegeben war nimmt der intern bei mir die A variante...... (Workfile : String; falls ihr das fragen/sagen wollt)
if AVIFileOpen(pfile, PChar(WorkFile), OF_WRITE or OF_CREATE, nil) <> AVIERR_OK then
|
AW: Bitmaps als AVI-Vido / MPEG-Video speichern
Hey KodeZwerg, herzlichen Dank für Deinen Einsatz.:thumb:
Funktioniert hier auch unter Delphi 10.2.3. |
AW: Bitmaps als AVI-Vido / MPEG-Video speichern
Ja gern geschehn, aber halt Windows vorbehalten (Video for Windows).
Bei der AviWriter komponente habe ich mal reingeschaut (zuletzt kam es mit Delphi 7 zum Einsatz), ja die Init abändern wie oben vorgeschlagen. Ich habe es auf die schnelle nicht zum laufen bekommen, aber wenn die VfW Variante Dir erstmal genug Reiz bietet, belasse ich es dabei. Ps: Musstest Du es wie ich auch abändern oder lief es out-of-box? |
AW: Bitmaps als AVI-Vido / MPEG-Video speichern
Ja, musste es abändern...
|
AW: Bitmaps als AVI-Vido / MPEG-Video speichern
Zitat:
Die müssen jetzt raten, was geändert wurde. Ich brauche es nicht aber vielleicht andere! gruss |
AW: Bitmaps als AVI-Vido / MPEG-Video speichern
@Eiweiss: KodeZwerg hat es doch in Beitrag 4 beschrieben, was er (und dann auch ich) geändert hat...
|
AW: Bitmaps als AVI-Vido / MPEG-Video speichern
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz