Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Versuch FFMPEG unter Android zum Laufen zu bekommen (https://www.delphipraxis.net/205233-versuch-ffmpeg-unter-android-zum-laufen-zu-bekommen.html)

TurboMagic 15. Aug 2020 16:04


Versuch FFMPEG unter Android zum Laufen zu bekommen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

wie der eine oder andere sicher schon gelsen hat, versuche ich Renate Schaaf's
FFMPEG Videoerzeugungs Demo unter ANdroid zum Laufen zu bekommen.

Ich bin damit zwar schon etwas weiter gekommen, hänge jetzt aber fest.
Anbei mal der aktuelle Stand. Das FFMultidemoLibraries.zip Archiv muss in den
Projektordner entpackt werden, da dort die für Android 32 bit nötigen "shared objects"
drin sind.

Ich bin inzwischen soweit, dass ich diese geladen bekomme und das Bestimmen von
Codecs hab ich von Dateiendung auf MIME-Type umgestellt, da ersteres unter Android
immer Probleme verursachte bzw. nichts fand für .mp4.

So, das Problem ist nun der Aufruf der Funktion
ret := avcodec_open2(c, codec, @CodecSetup.OptionsDictionary);
in UBitmaps2VideoM's Konstruktor.

Der liefert als Rückgabewert immer -13, was keine Berechtigung bedeutet.
Dabei ist es egal, ob ich als Video Ausgabepfad den GetSharedDownloadsPath
nutze und vorher Schreibberechtigung auf den externen Speicher anfordere, oder
ob ich nur nach GetDocumentsPath schreiben will.

Was für eine Berechtigung fehlt mir da?

Renate Schaaf 15. Aug 2020 19:32

AW: Versuch FFMPEG unter Android zum Laufen zu bekommen
 
Versuch mal nil statt @CodecSetup.OptionsDictionary, was anderes fällt mir nicht ein.

Ich habe festgestellt, dass die strings die ich übergeben habe, wenn PAnsichar erforderlich war, nicht ordentlich 0-terminiert sind. Win32 fand das wohl nicht schlimm. Aber vielleicht trägt das zu den Android-Problemen bei. So habe ichs jetzt geändert:

Delphi-Quellcode:
  bytes := TEncoding.UTF8.GetBytes(aString);
  SetLength(bytes,Length(bytes)+1);
  bytes[Length(bytes)-1]:=Byte(#0);
PAnsiChar(@bytes[0])
enthält dann den richtigen string. Wenn das irgendwie weniger "von hinten durch die Brust ins Auge" geht, wäre ich interessiert.

Zur Erklärung: Unter Android ist
PAnsiChar = MarshaledAString;

TurboMagic 16. Aug 2020 08:55

AW: Versuch FFMPEG unter Android zum Laufen zu bekommen
 
Hallo,

danke für deine Ideen. Habe beide umgesetzt, ist nur leider auch noch nicht die Lösung...

Grüße
TurboMagic

TiGü 16. Aug 2020 10:55

AW: Versuch FFMPEG unter Android zum Laufen zu bekommen
 
Für dein 30 FPS Problem ist das aber eine ziemlich umständliche Lösung.
Leider hattest du keine Rückmeldung mehr dazu gegeben:
https://www.delphipraxis.net/205189-...rmausgabe.html

TurboMagic 16. Aug 2020 14:52

AW: Versuch FFMPEG unter Android zum Laufen zu bekommen
 
Zitat:

Zitat von TiGü (Beitrag 1471893)
Für dein 30 FPS Problem ist das aber eine ziemlich umständliche Lösung.
Leider hattest du keine Rückmeldung mehr dazu gegeben:
https://www.delphipraxis.net/205189-...rmausgabe.html

Mittels eines anderen testprogramms haben wir mal testhalber einen Video erzeugt und das wäre zumindest
ein funktionierender Lösungsansatz. Unser Video würde auch nur wenige Sekunden Lang.

TurboMagic 19. Aug 2020 19:39

AW: Versuch FFMPEG unter Android zum Laufen zu bekommen
 
Hallo,

bin noch nicht dazu gekommen es auszuprobieren,
aber könnte es sein, dass das was hier beschrieben ist:

https://github.com/bmegli/hardware-v...coder/issues/5

mit rein spuckt?
Ich weiß jetzt nicht ob wir den h264 encoder selektiert haben da die
Namen in der Encoder Auswahlliste leider leer sind (muss mal die Demo so umbauen, dass
nicht die Namen gelistet werden sondern was anderes aussagekräftiges)

Grüße

TurboMagic

PS: Renate, wie weit ist deine Üublikation als Open Source gediehen?

TurboMagic 19. Aug 2020 20:21

AW: Versuch FFMPEG unter Android zum Laufen zu bekommen
 
Ok, ich sah' inzwischen dass im Code ein entsprechender Aufruf der anderen Funktion vorher drin ist.
Also mal doch testhalber einen anderen Codec probieren. Für meinen Versuch mittels MIME-Type video/mp4
bekomme ich immerhin 2 gelistet.

TurboMagic 21. Aug 2020 12:13

AW: Versuch FFMPEG unter Android zum Laufen zu bekommen
 
Hallo,

klappt jetzt:

1. doch über Dateiendung gehen, der ursprüngliche Code war doch ok

2. Anzeige der Encoder so umbauen, dass bei Android nicht der long_name sondern
der name angezeigt wird.

3. Den Versuch den bevorzugten Encoder zu ermitteln bei Android unterlassen,
da das eine Exception verursacht

4. Vor dem Erzeugen des Videos (TPath.GetPublicDownloadsPath) Berechtigung für
exteral storage abfragen und im Event davon dann erst den Video erzeugen.

Dann gibt's kein Berechtigungsgemecker mehr...

Grüße
TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 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-2025 by Thomas Breitkreuz