AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Acinerella [Ver. 1.4] FFMpeg Wrapper
Thema durchsuchen
Ansicht
Themen-Optionen

Acinerella [Ver. 1.4] FFMpeg Wrapper

Ein Thema von igel457 · begonnen am 18. Jul 2008 · letzter Beitrag vom 23. Jan 2016
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von igel457
igel457
Registriert seit: 31. Aug 2005
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
Proben und Scoringsystem hinzugefügt
Internes und verbuggtes Protokol-System entfernt und ersetzt
Compiliert mit brandneuer ffmpeg-revision (vom 22. Mai 2010)
Makefile verbessert
Probleme mit dem Delphi-Memorymanager und Linux aufgelöst

Version 1.3
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

Version 1.2
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 (statisch oder dynamisch mit FFMpeg gelinkt)
Fehler in ac_free_decoder behoben
Delphi 2009 kompatibilität des Headers.

Version 1.1
Bug behoben, durch den Acinerella nach dem sequentiellen laden von einigen Dateien (3-10) mit einer AV abstürzt
Bug behoben, durch den Acinerella spätestens nach dem sequentiellen laden von 26 Dateien nicht mehr funktioniert
Der Header sollte nun auch mit Delphi 2009 laufen (siehe hier)
Die mitgelieferte test.c lief nur mit Cygwin, nicht wenn sie mit MinGW kompiliert wurde. Das ist jetzt auch behoben.
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)
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
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
Miniaturansicht angehängter Grafiken
demo_iteration_152.png  
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein

Geändert von igel457 (11. Jan 2011 um 16:03 Uhr)
 
mimi

 
FreePascal / Lazarus
 
#11
  Alt 16. Okt 2008, 19:20
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.
Michael Springwald
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

 
Turbo Delphi für Win32
 
#12
  Alt 16. Okt 2008, 19:43
Ä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.
Nikolai Wyderka
  Mit Zitat antworten Zitat
mimi

 
FreePascal / Lazarus
 
#13
  Alt 16. Okt 2008, 19:51
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 ?
Michael Springwald
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

 
Turbo Delphi für Win32
 
#14
  Alt 17. Okt 2008, 01:33
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.
Nikolai Wyderka
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#15
  Alt 18. Apr 2009, 11:40
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#16
  Alt 2. Aug 2009, 16:00
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
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#17
  Alt 22. Mai 2010, 00:37
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
Proben- und Scoringsystem hinzugefügt
Internes und verbuggtes Protokol-System entfernt und ersetzt
Compiliert mit brandneuer ffmpeg-revision (vom 22. Mai 2010)
Makefile verbessert
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
Andreas
  Mit Zitat antworten Zitat
ekke
 
#18
  Alt 27. Mai 2010, 12:36
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
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#19
  Alt 27. Mai 2010, 18:27
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
Andreas
  Mit Zitat antworten Zitat
ekke
 
#20
  Alt 27. Mai 2010, 18:59
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 18:32 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