AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TBitmaps2Video
Thema durchsuchen
Ansicht
Themen-Optionen

TBitmaps2Video

Ein Thema von Renate Schaaf · begonnen am 26. Jul 2020 · letzter Beitrag vom 21. Mär 2021
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    
Renate Schaaf
Registriert seit: 25. Jun 2020
Ich verfolge dieses Forum seit einiger Zeit passiv mit viel Vergnügen und habe nützliche Hinweise gefunden.
Jetzt möchte ich gern mein neuestes Projekt zur Diskussion stellen, eine Klasse, die es ermöglicht sequentiell Bitmaps zu einem Video zusammenzustellen. Ich kann mir vorstellen, dass die/der eine oder andere sowas gebrauchen kann. Die Klasse baut auf den Libav(ffmpeg)-dlls auf, aber mein Ziel war es, ein interface mit leicht und intuitiv verständlichen Prozeduren und Einstellungen herzustellen, ohne dass man sich um die etwas obskuren und technischen Prozeduren in den dlls kümmern muss.

Jetzt zu finden auf GitHub:
https://github.com/rmesch/Bitmaps2Video

Update:
Source code: Bitmaps2Video_3.zip
Es werden jetzt 7 Codecs unterstützt, m.E. die wichtigsten.
Das geänderte interface ist jetzt:

Delphi-Quellcode:
///<summary>Sequentially encode bitmaps to a compressed video. Uses Libav Dlls. </summary>
  TBitmapEncoder = class
.....
    /// <param name="filename"> Output filename. Extension picks the container format (.mp4 .avi .mkv ..)
    /// </param>
    /// <param name="Width"> Video size in pixels (multiples of 2)</param>
    /// <param name="Height"> Video size in pixels (multiples of 2)</param>
    /// <param name="FrameRate"> Frames per second (can be slightly off in the resulting file)</param>
    /// <param name="Quality"> Encoding quality, scale from 0 to 100. 0 gives marginally acceptable quality </param>
    /// <param name="CodecId"> (TAVCodecID see UFormats.pas) Identifier of the codec to use. AV_CODEC_ID_NONE picks the default codec for the file extension. </param>
    /// <param name="VideoScaling">Resample algo used if video size differs from bitmap size </param>
    constructor Create(const filename: string; Width, Height: integer;
      FrameRate: integer; Quality: byte; CodecId: TAVCodecId = AV_CODEC_ID_NONE;
      VideoScaling: TVideoScaling = vsFastBilinear);

    /// <summary> Turn a Bitmap into a movie frame </summary>
    /// <param name="bm"> Bitmap(TBitmap) to be fed to the video. Will be converted to pf32bit if not already </param>
    procedure AddFrame(const bm: TBitmap);

    /// <summary> Hold the last frame </summary>
    /// <param name="EffectTime"> Displaytime(integer) in ms </param>
    procedure Freeze(EffectTime: integer);

    /// <summary> Add a picture which is displayed for a certain time </summary>
    /// <param name="bm"> Bitmap(TBitmap) of the picture to be displayed </param>
    /// <param name="ShowTime"> Time(integer) in ms for the display </param>
    procedure AddStillImage(const bm: TBitmap; ShowTime: integer);

    /// <summary> Make a smooth transition from SourceR to TargetR within EffectTime.</summary>
    /// <param name="bm"> The Bitmap(TBitmap) to be animated </param>
    /// <param name="SourceR"> Beginning rectangle(TRectF) within rect(0,0,bm.width,bm.height) </param>
    /// <param name="TargetR"> End rectangle(TRectF) within rect(0,0,bm.width,bm.height) </param>
    /// <param name="EffectTime"> Duration(integer) of the animation in ms </param>
    /// <param name="ZoomOption"> Quality of the zoom (zoAAx2, zoAAx4, zoAAx6, zoResample). </param>
    /// <param name="SpeedEnvelope"> Modifies the speed during EffectTime. (zeFastSlow, zeSlowFast, zeSlowSlow, zeLinear) </param>
    procedure ZoomPan(const bm: TBitmap; SourceR, TargetR: TRectF;
      EffectTime: integer; ZoomOption: TZoomOption;
      SpeedEnvelope: TZoomSpeedEnvelope = zeLinear);

    /// <summary> Close the file and make the output file usable. </summary>
    function CloseFile: Boolean;
Audio wird jetzt rudimentär unterstützt:
Delphi-Quellcode:
  /// <summary> Combine the video stream from VideoFile with the audio from Audiofile. The streams will just be copied, not encoded.
  ///Audio is clipped to video length. Raises exception if the format of the audio file is not supported.</summary>
  /// <param name="VideoFile"> (string) File which contains a video stream. Any audio stream present will be ignored. </param>
  /// <param name="AudioFile"> (string) Genuine audio file (.wav .mp3 .aac) the audio of which shall be added to the video in VideoFile. </param>
  /// <param name="OutputFile"> (string) Name of the file containing the newly combined video and audio. </param>
procedure MuxStreams2(const VideoFile, AudioFile: string;
  const OutputFile: string);

Das Projekt benötigt die ffmpeg-dlls und die zugehörigen Pascal-Headers. Beides kann man hier bekommen:
http://www.delphiffmpeg.com/downloads/

Näheres im Readme, und in meiner Antwort unten.

Ich bin sehr an Verbesserungsvorschlägen interessiert, vor allem, wie man die Schreibgeschwindigkeit erhöhen kann, und wie man eventuell die vorhandenen Libav-Filter dafür benutzen kann, und auch an Vorschlägen, was man noch einbauen sollte.

Renate
Angehängte Dateien
Dateityp: zip Bitmaps2Video_3.zip (460,3 KB, 44x aufgerufen)

Geändert von Renate Schaaf (26. Aug 2020 um 14:26 Uhr) Grund: Update
 
grizzly

 
Delphi XE4 Professional
 
#21
  Alt 11. Aug 2020, 12:40
Hallo!

Das ist ein tolles Projekt, das hätte ich schon viel früher brauchen können!

Da Du Dich mit der Schnittstelle ja schon länger beschäftigt hast: Gibt es da wohl eine einfache Chance, statt ein Video mit "Create" neu zu erstellen, ein bestehendes zu öffnen (und alle Parameter wie Größe und Codec von dort einzulesen), und da dann Frames dranzuhängen?
Ich weiß, alternativ kann man das alte Video natürlich öffnen, alle Frames entpacken, in ein neues Video kopieren und dann die neuen Frames dranhängen - aber man ist ja bequem


Gruß
Michael
  Mit Zitat antworten Zitat
Renate Schaaf

 
Delphi 11 Alexandria
 
#22
  Alt 11. Aug 2020, 13:30
@grizzly Danke!

Zitat:
Gibt es da wohl eine einfache Chance, statt ein Video mit "Create" neu zu erstellen, ein bestehendes zu öffnen (und alle Parameter wie Größe und Codec von dort einzulesen), und da dann Frames dranzuhängen?
Geht. Das erste Video bestimmt dann alles, die Bitmaps werden passend dazu komprimiert. Nur wie sag ichs dem user?

Constructor CreateFromVideo?

müsste verständlich sein. Aber was soll mit dem Audio im ersten Video passieren, einfach drin lassen? Erstmal ignorieren denke ich.

@Turbomagic Du hast sicher den neuen upload TinyMJpeg schon angeguckt, ich kann im Moment nichts testen, aber das sieht doch genauso aus wie das, was du brauchst.

Gruß, Renate
Renate

Geändert von Renate Schaaf (11. Aug 2020 um 13:37 Uhr)
  Mit Zitat antworten Zitat
grizzly

 
Delphi XE4 Professional
 
#23
  Alt 11. Aug 2020, 14:25
Ha, Audio, das war Luxus an den ich gar nicht gedacht habe.

Mit dem Anhängen an ein bestehendes Video hat man halt die Möglichkeit, das Rendern mal zu unterbrechen und zu einem späteren Zeitpunkt fortzusetzen. Mit meinen selbstgestrickten Billiglösungen muss ich immer alle Bitmaps aufbewahren, bis ich endlich das finale Video in einem Rutsch zusammensetzen kann. (Und in meinem Fall nur MJPEG, das ist nicht so berauschend von der Qualität)

Aber natürlich: Je mehr Features, desto komplizierter wird wieder alles.

Ach, da fällt mir noch was ein: Wenn ich diese Klasse schon verwende, um die Videos zu schreiben, könnte man da auch gleich Frames aus dem Video auslesen? "GetFrame(42)". Wobei das vermutlich nicht ganz trivial ist, weil die Liste mit den Indizes (wo welches Bild zu finden ist) erst am Ende geschrieben wird. Da könnte man höchstens die schon bestehenden Frames auslesen wenn man Bilder an ein bestehendes Video anhängt. Vergiß es... Am Schluß wird die schöne kleine Klasse zum VollFeatureVideoEditingTool das man nicht mehr versteht...

Viele Grüße
Michael

Klitzekleinigkeit am Rande: In UBitmaps2Video.pas, Zeile 239, musste ich ein F hinter dem Rect einfügen.
    ZoomResampleTripleOnly(bm, am, RectF(0, 0, bm.Width, bm.Height), 1.8);
  Mit Zitat antworten Zitat
Renate Schaaf

 
Delphi 11 Alexandria
 
#24
  Alt 11. Aug 2020, 14:45
Zitat:
GetFrame(42)
Habe ich schon als utility, aber nur für ein fertiges Video, um ein Thumbnail zu erstellen, oder den ersten frame etwas länger zu zeigen bevor ein eingefügtes Video startet. Es wird Zeit, dass ich das Projekt veröffentliche.

Danke für das RectF, das ist bei mir overloaded.

Gruß, Renate
Renate
  Mit Zitat antworten Zitat
TurboMagic

 
Delphi 12 Athens
 
#25
  Alt 12. Aug 2020, 20:23
Danke Renate für deine Bibliothek und dein Beispielprojekt.
Wir haben heute begonnen es auszuprobieren um dann mit dem Wissen unser eigenes minimaloistisches Win32 FMX Programm zu erstellen,
welches wir danach nach ANdroid portieren wollen.

Zu deinem Projekt (außer dem Einstellen als Open Source ) noch ein weiterer Tipp:
Irgendwo baust du dir Pfad und Dateiname mittels + und '\dateiname.wasauchimmer' zusammen.
Schau dir mal TPath.Combine aus IOUtils der RTL an, das funktioniert sogar crossplattform
kompatibel und wäre der modernere Weg.

Für das Projekt braucht man ja die DLLs (oder .so's) von der Delphi ffmpeg Webseite.
Das mit der Lizenz hab' ich nicht 100% verstanden. Ich interpretiere es aber so, dass die API
header Übersetzung frei ist, die DLLs auch (GPL oder LGPL Variante) und nur derein eigene
darauf aufbauende Bibliothek einer kommerziellen Lizenz unterliegt. Richtig?

Grüße

TurboMagic
  Mit Zitat antworten Zitat
Renate Schaaf

 
Delphi 11 Alexandria
 
#26
  Alt 12. Aug 2020, 23:47
@Turbomagic

Ich habs doch grad fertig!

Compiliert für Android und Win32 (anderes nicht getestet), demo läuft unter Windows, Android kann ich nicht testen.

Ich habe extra für dich eine Prozedur eingefügt:
Delphi-Quellcode:
AddColorFrame(Color: TBGR)
TBGR=record
Blue: byte;
Green: byte;
Red: byte;
end;
Jetzt kannst du dir den Weg über die Bitmap sparen, das ist viel schneller. (Bitmap hab ich nicht mal getestet...)

Ich habe ein neues Header-file gefunden, ist im Ordner FFMPEGHeader (zum searchpath hinzufügen), und ist für alle dlls.
Die Android-Library habe ich nicht dazugepackt, wurde zu groß.

Das mit der Lizenz verstehe ich so wie du. Aber guck mal hier: https://github.com/PassByYou888/FFMPEG-Headerhttp://, da gibt es alles nochmal, und da hab ich das neue header-file her.

So, dann werde ich mir morgen mal GitHub zu Gemüte führen. Es wird dann erstmal eine Win32-Version mit mehr features geben, und eine Cross-Platform-Version. Ohne dich hätte ich mich nie an das fmx-Zeug gemacht.

Gruß Renate
Angehängte Dateien
Dateityp: zip Bitmaps2VideoMulti.zip (249,1 KB, 12x aufgerufen)
Renate
  Mit Zitat antworten Zitat
TurboMagic

 
Delphi 12 Athens
 
#27
  Alt 13. Aug 2020, 14:48
Hallo,

wir versuchen gerade deine Demo zu testen,
bekommen aber sofort beim Starten eine Zugriffsverletzung.
Nur bevor die erste Zeile im FormCreate erreicht wird.

Die DLLs habe ich aus dem funktionierenden VCL Projekt
in den Ordner mit der erzeugten exe-Datei kopiert.

Delphi Version ist 10.2 Update 3.

Hat jemand eine Idee?

Grüße
TurboMagic
  Mit Zitat antworten Zitat
TurboMagic

 
Delphi 12 Athens
 
#28
  Alt 13. Aug 2020, 15:08
Ok, inzwischen eines gelernt:

FFMpeg aus deinem neuen FMX Beispiel will ältere DLLs als die,
die wir von der VCLFFMPEG Seite geladen haben.
Da stimmt die Version im Dateinamen der DLLs nicht,

Aber auch das äkltere auf der VCLFFMPEG Seite gelistete Paket hat
DLLs mit den neuen Namen...
  Mit Zitat antworten Zitat
TurboMagic

 
Delphi 12 Athens
 
#29
  Alt 13. Aug 2020, 15:28
Ok, haben die FFMPAG Pascal Umsetzung auf Github gefunden und dort sind auch passende DLLs vorhanden.
Läuft jetzt also! Danke!
  Mit Zitat antworten Zitat
Renate Schaaf

 
Delphi 11 Alexandria
 
#30
  Alt 13. Aug 2020, 16:31
Gut. Werde mir die Versionen noch mal genau angucken müssen. Ich hatte Probleme mit PAnsiChar und den anderen headers.
Renate
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz