Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Acinerella [Ver. 1.4] FFMpeg Wrapper (https://www.delphipraxis.net/117475-acinerella-%5Bver-1-4%5D-ffmpeg-wrapper.html)

igel457 18. Jul 2008 21:29


Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Liste der Anhänge anzeigen (Anzahl: 1)
http://acinerella.sourceforge.net/img/acin_logo.jpg

Über:
Acinerella ist ein in C geschriebener Wrapper für die Dekodierfähigkeiten der FFMpeg Bibliotheken libavformat und libavcodec. Acinerella exportiert gerade mal 10 API-Funktionen - daher ist es sehr einfach die Headerdatei zu übersetzen und Acinerella mit anderen Programmiersprachen (zum Beispiel Pascal) zu verwenden. Würde man FFMpeg direkt verwenden wollen, so muss man drei 1000 Zeilen lange Header übertragen. Zwar gibt es eine Pascal Version dafür, doch diese ist nicht Up-To-Date und dazu höchst wahrscheinlich Fehlerhaft.
Acinerella ist einfach zu verwenden. Somit ist die größte Hürde auf dem Weg zum eigenen Video- und Audioplayer - das dekodieren der Daten - genommen. Die Datenströme werden direkt aus dem Speicher geladen, wodurch sich größtmögliche Freiheit bei der Entwicklung ergibt.

Alle FFMpeg Bibliotheken sind statisch mit Acinerella verbunden, wodurch sich eine einzelne, 2 MB große, DLL ergibt.

Einige unterstützte Formate:
  • Audioformate:
    • MP3
    • OGG
    • WAV, AIFF
    • WMA
    • AC3
    • FLAC
  • Videoformate:
    • MPEG2 (Als MPEG PS (*.mpg, *.vob) oder TS (z.b. *.ts))
    • H.246
    • AVI
    • WMV
    • MOV
    • FLV
    • OGG
    • Bink&Smacker

Wichtig:
Die Bibliothek ist unter der GPL veröffentlicht! Also wer damit geschriebene Programme veröffentlicht, muss (entsprechend der Lizenz) den Sourcecode davon ebenfalls offen legen.

Mehr Infos (oder auch nicht):
Auf der Acinerella Website:
http://acinerella.sourceforge.net/

Changelog:

Version 1.4
:arrow: Proben und Scoringsystem hinzugefügt
:arrow: Internes und verbuggtes Protokol-System entfernt und ersetzt
:arrow: Compiliert mit brandneuer ffmpeg-revision (vom 22. Mai 2010)
:arrow: Makefile verbessert
:arrow: Probleme mit dem Delphi-Memorymanager und Linux aufgelöst

Version 1.3
:arrow: Medieninformationen (Autor, Titel, Album, Länge, etc.) hinzugefügt
:arrow: Zeitsprungunterstützung hinzugefügt (ac_seek Funktion)
:arrow: Umgehung für springende Zeitstempel hinzugefügt (wie dies zum Beisipel bei OGG-Dateien der Fall war)
:arrow: Fehler in der Erzeugungsfunktion für einzigartige Protokollnamen behoben

Version 1.2
:arrow: Compiliert mit FFMpeg 0.5
:arrow: Neue Dateitypen: WMV, WMA, besserer Support für OGG-Theora, FLV
:arrow: "Streamseek" Callbackfunktion hinzugefügt (nicht für das aktive Suchen im Stream(!))
:arrow: Läuft ohne Probleme unter Linux (statisch oder dynamisch mit FFMpeg gelinkt)
:arrow: Fehler in ac_free_decoder behoben
:arrow: Delphi 2009 kompatibilität des Headers.

Version 1.1
:arrow: Bug behoben, durch den Acinerella nach dem sequentiellen laden von einigen Dateien (3-10) mit einer AV abstürzt
:arrow: Bug behoben, durch den Acinerella spätestens nach dem sequentiellen laden von 26 Dateien nicht mehr funktioniert
:arrow: Der Header sollte nun auch mit Delphi 2009 laufen (siehe hier)
:arrow: Die mitgelieferte test.c lief nur mit Cygwin, nicht wenn sie mit MinGW kompiliert wurde. Das ist jetzt auch behoben.
:arrow: Nach wie vor können maximal nur 26 Dateien gleichzeitig geöffnet sein. Wer will kann diese Beschränkung beheben (acinerella.c->unique_protocol_name)
:arrow: Die mitgelieferte DLL ist nun um ca. 1MB kleiner, was sich u.u. jedoch auf die Performance auswirken kann. Wer will kann sich seine eigene Version kompilieren.

Version 1.0
:arrow: Initiale Veröffentlichung

Der Download:
Im Anhang ist meine aktuelle Version der Bibliothek, sowie der Pascal-Header und ein in Delphi geschriebenes Demo Programm (Exe im Ordner /bin, Quellen im Ordner /header/pascal/demo). Um das Programm zu verwenden, einfach im Explorer die zu öffnende Videodatei per Ziehen und Ablegen auf das Exe-Symbol ziehen. Wird eine Videospur gefunden, so wird diese in einem Fenster (über die GDI, sieht daher mies aus) wiedergegeben. Die erste Audiospur wird in eine Datei "out.wav" im Arbeitsverzeichnis ausgegeben.

Die Bibliothek kann hier heruntergeladen werden:
http://downloads.sourceforge.net/aci...se_mirror=osdn (1.9 MB, TAR.BZ2)

Viel Spaß damit,
Andreas

Garfield 19. Jul 2008 14:03

Re: Acinerella FFMpeg Wrapper
 
Hallo, ich habe die Demo kurz mit einem MPEG2 PS mit M2V und MP2 und einer VOB mit M2V und AC3 ausprobiert. Das Bild ist in Ordnung so lange es nicht verkleinert wird und das Audio wird korrekt gespeichert. :thumb:

Nils_13 19. Jul 2008 14:04

Re: Acinerella FFMpeg Wrapper
 
Das Bild ist komplett in Ordnung. Es muss bloß mit OpenGL oder DirectX gezeichnet werden, da sonst die Geschwindigkeit von der Fenstergröße abhängt. Das ist also kein Fehler in Acinerella.

Garfield 19. Jul 2008 14:07

Re: Acinerella FFMpeg Wrapper
 
Zitat:

Zitat von Nils_13
Das ist also kein Fehler in Acinerella.

Steht ja schon oben in der Beschreibung der Demo.

matthiasluebbe 24. Sep 2008 20:17

Re: Acinerella FFMpeg Wrapper
 
Hi, super Projekt, ich hoffe es wird noch weiterentwickelt ;)

Ich habe da aber ein Problem:

Wenn ich den Quellcode kompilieren will bekomme ich folgende Meldung:

Delphi-Quellcode:
[Error] acinerella_demo.dpr(43): Undeclared identifier: 'ReportMemoryLeaksOnShutdown'
Kommentiere ich die entsprechende Zeile aus dann funktioniert es ohne Probleme.

Habe ich da etwas falsch gemacht oder ist das eine Delphi Funktion die mein Delphi 7 nicht unterstützt?

3_of_8 24. Sep 2008 20:36

Re: Acinerella FFMpeg Wrapper
 
Sieht mir nach ner Funktion von FastMM aus... Wenn du das installierst und in das Projekt einbindest, sollte es gehen. Dürfte aber auch einfach mit Auskommentieren der Zeile funktionieren.

_BlackDragon_ 5. Okt 2008 21:42

Re: Acinerella FFMpeg Wrapper
 
Hallo zusammen.

Zitat:

[Error] acinerella_demo.dpr(43): Undeclared identifier: 'ReportMemoryLeaksOnShutdown'
bzw.

Zitat:

Sieht mir nach ner Funktion von FastMM aus... Wenn du das installierst und in das Projekt einbindest, sollte es gehen. Dürfte aber auch einfach mit Auskommentieren der Zeile funktionieren.
Nein, es handelt sich um eine Variable in der System.pas.

Delphi-Quellcode:

{Set this variable to true to report memory leaks on shutdown. This setting
 has no effect if this module is sharing a memory manager owned by another
 module.}
  ReportMemoryLeaksOnShutdown: Boolean;
Bei mir BDS 2006.

Gruss BlackDragon

/EDIT:

Jetzt hab ich glatt vergessen, igel noch mitzuteilen... HUT AB !!! :hello: :cheer: :thumb:

Wie immer nur genialer Stuff aus deiner Ecke... :wink:

igel457 5. Okt 2008 21:52

Re: Acinerella FFMpeg Wrapper
 
Erstmal Danke für das Lob. Ich entwickle die Bibliothek immer dann weiter, wenn ich neue Features brauche - momentan läuft sie aber einigermaßen gut.

Diese "ReportMemoryLeaksOnShutdown" Zeile kann getrost weggelassen werden (ist nur um das Debugging zu erleichtern). Ohne die Zeile braucht man sich auch um auftretende Speicherlecks nicht mehr zu kümmern ;-)

mimi 8. Okt 2008 19:58

Re: Acinerella FFMpeg Wrapper
 
schade ! Unter Lazarus läuft es nicht wegen dem Scanline.

igel457 9. Okt 2008 19:54

Re: Acinerella [Ver. 1.1] FFMpeg Wrapper
 
Hab mal eine neue Version hoch geladen:
Code:
Version 1.1
 :arrow: Bug behoben, durch den Acinerella nach dem sequentiellen laden von einigen Dateien (3-10) mit einer AV abstürzt
 :arrow: Bug behoben, durch den Acinerella spätestens nach dem sequentiellen laden von 26 Dateien nicht mehr funktioniert
 :arrow: Der Header sollte nun auch mit Delphi 2009 laufen (siehe [url=http://www.delphipraxis.net/internal_redirect.php?t=142393]hier[/url])
 :arrow: Die mitgelieferte test.c lief nur mit Cygwin, nicht wenn sie mit MinGW kompiliert wurde. Das ist jetzt auch behoben.
 :arrow: Nach wie vor können maximal nur 26 Dateien gleichzeitig geöffnet sein. Wer will kann diese Beschränkung beheben (acinerella.c->unique_protocol_name)
 :arrow: Die mitgelieferte DLL ist nun um ca. 1MB kleiner, was sich u.u. jedoch auf die Performance auswirken kann. Wer will kann sich seine eigene Version kompilieren.
@mimi Ist ja auch nur eine Demo - Acinerella selbst ist äußerst Programmunabhängig und läuft vermutlich selbst auf dem Gameboy

PS: Außerdem ist Acinerella jetzt natürlich mit der allerneusten SVN-Version von FFMpeg ausgestattet.

mimi 16. Okt 2008 18:20

Re: Acinerella [Ver. 1.1] FFMpeg Wrapper
 
Ich bekomme keine acinerella.so erzeugen.
Ich bin in src verzeichnis gegangen und habe make aufgerufen von der Console.
Er gibt Fehler:
Zitat:

gcc -c -fPIC acinerella.c
In file included from acinerella.c:19:
acinerella.h:168: error: expected declaration specifiers or ‘...’ before ‘*’ token
acinerella.h:168: error: ‘__cdecl’ declared as function returning a function
acinerella.h:172: error: expected declaration specifiers or ‘...’ before ‘*’ token
acinerella.h:172: error: ‘__cdecl’ declared as function returning a function
acinerella.h:172: error: redefinition of typedef ‘__cdecl’
acinerella.h:168: error: previous declaration of ‘__cdecl’ was here
acinerella.h:174: error: expected declaration specifiers or ‘...’ before ‘*’ token
acinerella.h:174: error: ‘__cdecl’ declared as function returning a function
acinerella.h:174: error: redefinition of typedef ‘__cdecl’
acinerella.h:172: error: previous declaration of ‘__cdecl’ was here
acinerella.h:175: error: expected declaration specifiers or ‘...’ before ‘*’ token
acinerella.h:175: error: ‘__cdecl’ declared as function returning a function
acinerella.h:175: error: redefinition of typedef ‘__cdecl’
acinerella.h:174: error: previous declaration of ‘__cdecl’ was here
acinerella.h:176: error: expected declaration specifiers or ‘...’ before ‘*’ token
acinerella.h:176: error: ‘__cdecl’ declared as function returning a function
acinerella.h:176: error: redefinition of typedef ‘__cdecl’
acinerella.h:175: error: previous declaration of ‘__cdecl’ was here
acinerella.h:179: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_mem_mgr’
acinerella.h:182: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_init’
acinerella.h:183: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_free’
acinerella.h:193: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_open’
acinerella.h:200: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_close’
acinerella.h:203: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_get_stream_info’
acinerella.h:206: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_read_package’
acinerella.h:208: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_free_package’
acinerella.h:212: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_create_decoder’
acinerella.h:214: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_free_decoder’
acinerella.h:217: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_decode_package’
acinerella.c:35: error: expected specifier-qualifier-list before ‘ac_openclose_callback’
acinerella.c: In function ‘unique_protocol_name’:
acinerella.c:106: warning: incompatible implicit declaration of built-in function ‘strcpy’
acinerella.c: At top level:
acinerella.c:133: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘mgr_malloc’
acinerella.c:134: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘mgr_realloc’
acinerella.c:135: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘mgr_free’
acinerella.c:137: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_mem_mgr’
acinerella.c:147: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_init’
acinerella.c:160: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_free’
acinerella.c: In function ‘file_open’:
acinerella.c:177: error: ‘ac_data’ has no member named ‘open_proc’
acinerella.c:178: error: ‘ac_data’ has no member named ‘open_proc’
acinerella.c: In function ‘file_read’:
acinerella.c:187: error: ‘ac_data’ has no member named ‘read_proc’
acinerella.c:188: error: ‘ac_data’ has no member named ‘read_proc’
acinerella.c: In function ‘file_close’:
acinerella.c:197: error: ‘ac_data’ has no member named ‘close_proc’
acinerella.c:198: error: ‘ac_data’ has no member named ‘close_proc’
acinerella.c: At top level:
acinerella.c:204: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_open’
acinerella.c:257: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_close’
acinerella.c:264: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_get_stream_info’
acinerella.c:341: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_read_package’
acinerella.c:364: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_free_package’
acinerella.c:461: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_create_decoder’
acinerella.c: In function ‘ac_decode_video_package’:
acinerella.c:484: warning: ‘img_convert’ is deprecated (declared at /usr/local/include/libavcodec/avcodec.h:2514)
acinerella.c: In function ‘ac_decode_audio_package’:
acinerella.c:522: warning: assignment makes pointer from integer without a cast
acinerella.c: At top level:
acinerella.c:535: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_decode_package’
acinerella.c:574: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ac_free_decoder’
make: *** [acinerella] Fehler 1
Ich wollte deine LIB mal unter Linux ausprobieren. Weil da suche ich noch eine Möglichkeit unter Lazarus zuverlässig Videos und sowas abzuspielen ! TV Geht auch ? Toll !
ich wollte erstmal eine Linux LIb erzeugen bevor ich deinen Player ausprobieren kann.

inherited 16. Okt 2008 18:43

Re: Acinerella [Ver. 1.1] FFMpeg Wrapper
 
Ändere mal folgendes:
Vorher
Code:
#ifdef _WIN32
#define CALL_CONVT __cdecl
#else
#define CALL_CONVT __cdecl
#endif
Nachher
Code:
#ifdef _WIN32
#define CALL_CONVT __cdecl
#else
#define CALL_CONVT
#endif
Allerdings ist das (leider) nicht das einzige Problem. Viele Linux-Distributionen vertreiben Versionen von FFMpeg, die die alte img_convert nicht mehr an Bord hat, bzw. diese nicht mehr exportieren. Abhilfe schafft hier entweder das manuelle Kompilieren der FFMpeg oder das Warten auf eine der nächsten Acinerella-Versionen, denn ich denke dass Andreas diese Funktion ersetzen wird.
Solltest du einen Fehler beim Kompilieren der test.c erhalten, der besagt, dass O_BINARY nicht gefunden wurde, so musst du außerdem
folgendes in die test.c einfügen:
Code:
#ifndef WIN32
#define O_BINARY 0
#endif
Der "Fehler" rührt daher, dass es unter Linux eben keinen unterschied zwischen dem binären und "textuellen"(komisches Wort, nennt man das so?) Öffnen von Dateien gibt, unter Windows allerdings schon. Daher braucht man die Konstante unter Linux/Unix nicht und wird schlichtweg nicht definiert. Durch das Setzen auf 0 sollte es auch bei Oder-Verknüpfungen von diesen O_-Konstanten zu keinerlei Problemen kommen.

Viel Glück.

mimi 16. Okt 2008 18:51

Re: Acinerella [Ver. 1.1] FFMpeg Wrapper
 
jetzt bekomme ich folgende Fehler:
Zitat:

gcc -c -fPIC acinerella.c
acinerella.c: In function ‘unique_protocol_name’:
acinerella.c:106: warning: incompatible implicit declaration of built-in function ‘strcpy’
acinerella.c: In function ‘ac_open’:
acinerella.c:239: warning: incompatible implicit declaration of built-in function ‘strcpy’
acinerella.c:240: warning: incompatible implicit declaration of built-in function ‘strcat’
acinerella.c: In function ‘ac_decode_video_package’:
acinerella.c:484: warning: ‘img_convert’ is deprecated (declared at /usr/local/include/libavcodec/avcodec.h:2514)
gcc -shared -o acinerella.dll acinerella.o -lavformat -lavcodec -lavutil -lm -lws2_32
/usr/bin/ld: cannot find -lws2_32
collect2: ld returned 1 exit status
make: *** [acinerella] Fehler 1
Zitat:

Der "Fehler" rührt daher, dass es unter Linux eben keinen unterschied zwischen dem binären und "textuellen"(komisches Wort, nennt man das so?) Öffnen von Dateien gibt,
Was genau meinst du damit ? Meinst du damit das Linux nicht auf die Endung achtet sondern auf den Inhalt ?
oder was genau meinst du damit ?

inherited 17. Okt 2008 00:33

Re: Acinerella [Ver. 1.1] FFMpeg Wrapper
 
Hi,

bis das läuft ist wohl noch mehr zu tun.
Für die Warnungen musst du noch #include <string.h> hinzufügen, das ist ein kleiner Bug der aber in der aktuellen Version behoben sein sollte. Das mit der img_convert hatte ich ja bereits erwähnt, da bastelt Andreas dran.
Das letzte Problem ist ein Problem der Makefile, bishher ist es offenbar noch nicht gelungen eine Plattformabhänge Kompilierung hinzubekommen. Wenn du dir die Makefile mal anschaust, wirst du feststellen das es zwei befehle gibt, einen für Linux, einen für Windows. Du musst nur den richtigen ausführen. Das heißt, ich glaube in der im Moment offiziellen Version gibt es das noch nicht. Ersetz mal das in der Makfeile angegebene durch folgendes:
gcc -shared -o libacinerella.so acinerella.o -lavformat -lavcodec -lavutil -lm -lswscale

Zitat:

Was genau meinst du damit ? Meinst du damit das Linux nicht auf die Endung achtet sondern auf den Inhalt ?
oder was genau meinst du damit ?
Nein. Ich glaube O_TEXT unter Windows würde bis zum ersten 0-Zeichen lesen, und danach die Datei als fertig gelesen betrachten, da es so vorgesehen ist. Unter Unix wird immer bis EOF gelesen, egal ob Binär oder Text, da gibt es unter Unix keinen unterschied. Vielleicht spielt auch noch CR+LF eine Rolle.

igel457 18. Apr 2009 10:40

Re: Acinerella [Ver. 1.1] FFMpeg Wrapper
 
Hallo,

es gibt eine neue Version von Acinerella: 1.2

Änderungen:
+ Compiliert mit FFMpeg 0.5
+ Neue Dateitypen: WMV, WMA, besserer Support für OGG-Theora, FLV
+ "Streamseek" Callbackfunktion hinzugefügt (nicht für das aktive Suchen im Stream(!))
* Läuft ohne Probleme unter Linux
* Fehler in ac_free_decoder behoben
* Delphi 2009 kompatibilität des Headers.

Download:
http://downloads.sourceforge.net/aci...se_mirror=osdn

Viel Spaß damit!

EDIT: Wer sich vor 12:55 das Paket heruntergeladen hat, sollte dies nochmal tun - ich hatte vergessen die Makefile auszutauschen und in der Demo war noch ein Bug.

igel457 2. Aug 2009 15:00

Re: Acinerella [Ver. 1.3] FFMpeg Wrapper
 
Hallo,

ich habe eine neue Version von Acinerella hochgeladen.

Acinerella 1.3 hat folgende Änderungen:
+ Medieninformationen (Autor, Titel, Album, Länge, etc.) hinzugefügt
+ Zeitsprungunterstützung hinzugefügt (ac_seek Funktion)
+ Umgehung für springende Zeitstempel hinzugefügt (wie dies zum Beisipel bei OGG-Dateien der Fall war)
* Fehler in der Erzeugungsfunktion für einzigartige Protokollnamen behoben

Viel Spaß damit,
Andreas

igel457 21. Mai 2010 23:37

Re: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Hi,

nachdem ich in den letzten Monaten immer mal wieder ein bisschen an Acinerella gebastelt habe, möchte ich euch diese Änderungen nicht vorenthalten und habe ein neues Release zusammengeschustert:

Folgende Änderungen:

Version 1.4
:arrow: Proben- und Scoringsystem hinzugefügt
:arrow: Internes und verbuggtes Protokol-System entfernt und ersetzt
:arrow: Compiliert mit brandneuer ffmpeg-revision (vom 22. Mai 2010)
:arrow: Makefile verbessert
:arrow: Probleme mit dem externen Memorymanager unter Linux aufgelöst

Den Download gibt es wie gewohnt im ersten Post oder zusammen mit mehr Informationen unter http://acinerella.sf.net/

Viel Spaß damit, ich freue mich auf euer Feedback,
Andreas

ekke 27. Mai 2010 11:36

Re: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Hallo,
erstmal vielen Dank für das Update (und natürlich für das gesamte Projekt).

Ich habe 3 Fragen:

1.) Die Funktion "ac_decode_package" schreibt auf die Konsole (Fehlermeldungen), kann man das Abstellen / Umleiten?

2.) Die Funktionen "ac_open" und "ac_probe_input_buffer" gibt einen "PAc_proberesult" wert zurück, der nur als Pointer deklariert ist. Was verbirgt sich denn tatsächlich dahinter?

3.) Gibt es eine Möglichkeit die "Art" des Videobildes zu bestimmen? Bei MPEG2 interessieren mich eigendlich nur die "I"-Frames, bei MPEG-4 nur die "Reference Images".

Vielen Dank! Gruß Ekkehard

igel457 27. Mai 2010 17:27

Re: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Hallo,

1.) Nein, nicht dass ich wüsste. Eventuell gibt es in FFMpeg eine entsprechende Funktion. Sobald kein Konsolenfenster da ist, wird aber auch nichts angezeigt und es gibt auch keine I/O Fehlermeldung.

2.) Dahinter verbirgt sich ein Pointer auf AVInputFormat. Falls du überprüfen möchtest, ob Acinerella eine bestimmte Datei öffnen kann, kannst du ein paar Bytes daraus mit "ac_probe_input_buffer" Testen. Damit beim Öffnen der Datei diese Überprüfung nicht erneut stattfinden muss, kannst du das "probe result" direkt an "ac_open" übergeben.

3.) Nein, das ist aktuell nicht möglich, sollte aber eigentlich relativ einfach einzubauen sein. Über jede Mithilfe und jeden Patch freue ich mich.

Hoffe, dir geholfen zu haben,
Andreas

ekke 27. Mai 2010 17:59

Re: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Danke für die Antworten.
zu 3.)
Wenn etwas bei meiner Arbeit "abfällt" bin ich gerne bereit das wieder zu Verfügung zu stellen. Allerdings müsste dazu ja die DLL neu kompiliert werden - aber wie geht das (welcher Compiler etc.)?

Gruß Ekkehard

igel457 27. Mai 2010 18:14

Re: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Zitat:

Zitat von ekke
Allerdings müsste dazu ja die DLL neu kompiliert werden - aber wie geht das (welcher Compiler etc.)?

Du benötigst dafür GCC/MinGW. Dann musst du FFMpeg für Windows statisch kompilieren und installieren. Anschließend kannst du ganz einfach Acinerella mit einem einfachen "make" compilieren. Leider ist das Ganze (unter Windows) nicht gerade trivial. Ganz ohne Linuxkenntnisse könnte es schwierig werden.

Eine Anleitung eine entsprechende Buildumgebung zu schaffen (welche ganz genau Schritt für Schritt befolgt werden muss) findet sich hier: http://ffmpeg.arrozcru.org/wiki/inde...itle=Main_Page

ekke 28. Mai 2010 08:04

Re: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Ok, das sieht - für mich als Delphi verwöhnten - *sehr* kompliziert aus. Mit Linux kenne ich mich ein wenig aus (ls, cd & co.). Mein enger Zeitrahmen wird aber verhindern das ich mich da durchwühle.
Danke trotzdem!

ekke 28. Mai 2010 13:47

Re: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Was die "Key Frames" (oder Intra-Frames) angeht habe ich etwas gefunden.
Die function ac_read_package liefert einen Zeiger zurück, der mehr enthält als die Deklaration TAc_Package hergibt.
Ich habe wie folgt deklariert
Delphi-Quellcode:
 
const
  AV_PKT_FLAG_KEY = $0001;

type
  PAVPacket = ^TAVPacket;
  TAVPacket = packed record {56}
    pts: int64;                           ///< presentation time stamp in time_base units
    dts: int64;                           ///< decompression time stamp in time_base units
    data: PByte;
    size: integer;
    stream_index: integer;
    flags: integer;
    duration: integer;                        ///< presentation duration in time_base units (0 if not available)
    destruct: procedure (p: PAVPacket);
    priv: pointer;
    pos: int64;                           ///< byte position in stream, -1 if unknown
  end;
  PAc_package_Overload = ^TAc_package_Overload;
  TAc_package_Overload = packed record
    {The stream the package belongs to.}
    stream_index: integer;
    _offset1 : integer;
    AVPacket: TAVPacket;
  end;
Dann kann das Ergebnis mittels typecast wie folgt verwendet werden

Delphi-Quellcode:
pack := ac_read_package(inst);
...
iskeyframe := ((PAc_package_Overload(pack)^.AVPacket.flags and AV_PKT_FLAG_KEY) <> 0);
die Boolsche Variable "iskeyframe" wird True wenn ein Startbild decodiert wurde. Funktioniert bei meinem H.264 HD test strom fast (selten ist das erste Frame nur grau) immer.

Gruß Ekkehard

ekke 15. Jun 2010 17:05

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Hallo,
nach intensivem Testen glaube ich, dass die Bibliothek ein Speicherleck hat. Wird die Funktions ac_open zyklisch Aufgerufen sieht man im Taskmanager aber auch mit sysinternals Process Explorer das immer mehr Speicher genommen wird.
Die Speicher wird nicht über die deklarierten Funktionen "malloc" "realloc" geholt. Ich glaube das Ganze Problem entsteht im "probe" Bereich.
Irgendwelche Ideen?
Gruß Ekkehard

igel457 15. Jun 2010 18:44

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Hallo,

ich bastle gerade am Linux Support meiner Audio Bibliothek und bin in diesem Zuge außerdem dabei Acinerella dort ebenfalls mit allen Formaten zum laufen zu kriegen, weshalb ich nochmals einige Änderungen durchgeführt habe: Z.B. ist der externe Speichermanager vorerst rausgeflogen, weil hierdurch nicht der 16-Byte Align und Padding am Ende eingehalten wurde.

Ich werde im Zuge meiner Änderungen valgrind's memcheck auf das Problem ansetzen und mitteilen ob mir irgendetwas aufgefallen ist. U.u. ist es ein Windows-Spezifisches Problem oder ein Problem mit dem verwendeten ffmpeg-checkout.

Grüße,
Andreas

tferl 13. Aug 2010 13:57

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Hallo Zusammen,

zunächst einmal Vielen Dank für dieses geniale Projekt.

Mit der Thematik selbst habe ich mich bislang noch nie beschäftigt und konnte Dank der schlanken übersichtlichen Bibliothek dennoch in kürzester Zeit ein Programm basteln, welches mir eine Thumbnail-Übersicht des gewählten Video-Clips erstellt.
Es funktioniert prima, jedoch möchte ich im nächsten Schritt den ganzen Prozess beschleunigen, indem ich mich "springend" durch den Stream bewege.

Dazu müsste ich die Funktion ac_seek() verwenden.

<ZITAT>
{Seeks to the given target position in the file. The seek funtion is not able to seek a single audio/video stream
but seeks the whole file forward. The deocder parameter is only used as an timecode reference.
The parameter "dir" specifies the seek direction: 0 for forward, -1 for backward.
The target_pos paremeter is in milliseconds. Returns 1 if the functions succeded.}
function ac_seek(pDecoder: PAc_decoder; dir: integer; target_pos: int64): integer; cdecl; external ac_dll;
</ZITAT>

Offen gestanden verstehe ich die Erklärung nicht.

Bedeutet der Aufruf ac_seek(Ac_decoder, 0 , 1000 ) , dass ich mich um 1000ms vorwärts bewege ?

Vielen Dank
thomas

igel457 14. Aug 2010 16:14

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Die Funktion arbeitet nur mit absoluten Werten (wäre er relativ hätte ich ihn vermutlich timecode_offs genannt). Der DIR Parameter wird von FFMpeg benötigt, da FFMpeg unter Umständen nicht weiß, wo sich der Stream aktuell befindet und somit wissen muss, ob es nun vorwärts oder rückwärts suchen soll.

Mit dem Kommentar am Anfang meine ich nur, dass nicht getrennt in Audio-/Video-Streams gesucht werden kann, sondern nur jeweils in einem einzelnen, obwohl man einen einzelnen Dekoder für einen Teilstream angibt. Zum Suchen wird jedoch der Timecode, der im angegebenen Teilstream steckt, verwendet.

Ich hoffe, ich habe alle Klarheiten nun beseitigt ;-)

tferl 16. Aug 2010 12:26

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Hallo Andreas,

vielen Dank für Deine schnelle Antwort.

Stimmt - hätte ich mit etwas überlegen selbst herausfinden können.
Das man im Audio- und Videostream nicht getrennt "navigieren" kann sehe ich
für meinen Zweck nicht als Nachteil.

Zusammegefasst bedeutet dies, dass ich beim Funktionsaufruf ac_seek(ACDecoder, 0 , 10000);
an die Position 10 Sekunden ab Clipbeginn springe ???

Wenn ich das so probiere, liefert mir der folgende Aufruf
ac_read_package(AC_instance) ein NIL zurück.
(Der Clip ist natürlich länger als 10 Sekunden)


Ich bitte um Nachsicht für meine Unbeholfenheit, aber wie schon gesagt
das Thema ist absolut neu für mich....

Viele Grüße
thomas

igel457 16. Aug 2010 12:42

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Ja, die Annahme ist korrekt ;-) Nur wenn du bereits 10 Sekunden abgespielt hast, musst du -1 als zweiten Parameter übergeben.

Leider ist das springen in Videos eine kniffelige Angelegenheit und ob und wie gut es funktioniert hängt vor allem vom Containerformat ab - und auch FFMpeg ist leider nicht perfekt.

Um das Springen im Video zu ermöglichen musst du auf jeden Fall eine "Seek"-Callback-Prozedur an die ac_open Routine übergeben.

Beim Abspielen von Audio, wofür ich Acinerella persönlich am meisten einsetze funktioniert das Suchen jedoch meistens einwandfrei (außer für FLAC Dateien ohne OGG-Container).

Andreas

tferl 16. Aug 2010 23:18

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
...dadurch dass ich nur die Keyframes weiter auswerte "rennt" das Programm recht schnell durch den Film und liefert mir die gewünschte Vorschau. Da die CPU ja zu 100% bezahlt ist, kann sie auch mal in der Mittagspause was tun und so komme ich auch ohne "Sprünge" zum Ziel.

nochmals Vielen Dank

mimi 9. Jan 2011 17:45

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Ich habe Acinerella Erfolgreich unter Linux Kompilieren können und kann sie in Lazarus nutzen. Nur habe ich eine Frage:
Im ersten Beitrag von diesem Thread steht drin, dass man mit Acinerella ein Multiemdiaplayer schreiben könnte. Aber wie? Ich finde keine Passenden Funktion/Proceduren dafür. Das Demo Programm hilft mir auch nicht wirklich weiter. Denn, es spielt keine Datei wirklich ab, die ich hören könnte oder verstehe ich hier etwas Falsch? Ich dachte folgendes müsste gehen: Ich öffne eine Audio Datei und kann sie dann Abspielen und Anhören.

igel457 9. Jan 2011 22:22

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Hi,

Acinerella kümmert sich um das Dekodieren von Audio- und Videoströmen. Es werden also sehr komplex komprimierte Daten in einfach zu verwendete Rohdaten "zurückverwandelt". Audiodaten in "PCM-Wave" und Videodaten in einfache "RGB-Bitmaps". Auf dem Weg zur Multimediawiedergabe ist dieser Schritt der schwierigste.

Um die Daten wiederzugeben, müssen sie "nur noch" an eine entsprechende Ausgabebibliothek gestreamt werden - wenn man sich mit Threads und Pointern auskennt ist das auch kein Problem. Für alle anderen gibt es zum Beispiel Audorra mit welches unter Zuhilfenahme von Acinerella fast jedes existierende Audioformat Plattformübergreifend wiedergibt oder das Video-Modul von Andorra 2D.

Hoffe das hilft dir,
Andreas

mimi 10. Jan 2011 12:31

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Sowas habe ich mir schon gedacht. Audorra läuft bei mir leider nicht. Warum weiß ich nicht. Ich habe den Fehler im Code gesucht und es wird eine Variable nicht Installisiert. Dazu in einem Extra Thread mehr(Zu gegebener Zeit)

Erstmal Danke für deine Antwort.Die Beschreibung hat mich etwas anders vermuten Lassen. Vielleicht könntest du sie noch mal Anpassen. Das Beispiel Programm z.b. Spielt leider auch keine Audio Dateien ab, ist das dafür überhaupt vorgesehen?
Habe es mit OGG und MP3 Dateien versucht. es werden nur Informationen angezeigt. Mehr leider nicht.

igel457 11. Jan 2011 15:01

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
das Beispielprogramm erzeugt aber eine Datei "out.wav", die du dir mit einem anderen Player anhören kannst.

Peter666 21. Jan 2016 10:21

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Ich weiß der Post ist ziemlich "alt", aber hat schon einmal jemand versucht Acinerella für iOS, OSX bzw. Android zu kompilieren? Ich glaube auch das sich die FFmpeg header mal wieder geändert haben. Ich hatte vor Jahren mal angefangen diese nach Delphi zu übersetzen, es dann aber nach einiger Zeit aufgegeben. Die ändern andauernd irgendwelche Funktionen, Structs und Bezeichner.

Ich hatte mir via git clone git://source.ffmpeg.org/ffmpeg.git die aktuelle Version geladen und wollte das ganze kompilieren. Mal abgesehen von den dutzenden illegal option Fehlern. Das makefile ist sicher nur für Linux ausgelegt :(

Peter

CHackbart 23. Jan 2016 21:49

AW: Acinerella [Ver. 1.4] FFMpeg Wrapper
 
Das kenn ich nur allzu gut, FFMpeg ist ein tolles Projekt, aber der Code ist gewöhnungsbedürftig. Das wird sich denke ich auch niemals ändern, aber sobald man notgedrungen die Header übersetzt hat "versteht" man zumindest die Logik dahinter. Ich mag mich nicht anmaßen das ganze zu bewerten, aber ich würde es persönlich so nicht machen. Anyway, es ist halt so wie es ist.
Ich hab vor ein paar Jahren mal die FFMPEG Player Komponente von http://flashavconverter.com gekauft und regelmäßig angepasst. Der Autor aktualisiert in regelmäßigen Abständen die Header-Dateien. Leider nicht so häufig wie man das selber gerne hätte und dementsprechend musste ich irgendwann selber Hand anlegen.

Meine persönliche Erkenntnis daraus ist:

1. Die in den DLL's exportierten Funktionen ändern sich eigentlich nie. Major-Updates entfernen Funktionen die als depreciated deklariert sind.
2. Die Anzahl der übersetzten Structs, sollten minimiert werden. Also alles was man nicht braucht, da reicht ein pointer.
3. AVCodecContext und AVFrame sind wichtig und da gilt der Hauptaugenmerk drauf.

Im Prinzip werden bei Minor-Updates neue Variablen in den Structs fröhlich angehängt und andere Variablen als depreciated mit einem Compilerflag versehen. Ändert sich die Majorversion wird fröhlich gekürzt. Solange man wirklich nur das nutzt, was man braucht, dann ist das ganze übersichtlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 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