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 3 von 4     123 4      
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 15:03 Uhr)
 
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#21
  Alt 27. Mai 2010, 18:14
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
Andreas
  Mit Zitat antworten Zitat
ekke
 
#22
  Alt 28. Mai 2010, 08:04
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!
  Mit Zitat antworten Zitat
ekke
 
#23
  Alt 28. Mai 2010, 13:47
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
  Mit Zitat antworten Zitat
ekke
 
#24
  Alt 15. Jun 2010, 17:05
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
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#25
  Alt 15. Jun 2010, 18:44
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
Andreas
  Mit Zitat antworten Zitat
tferl

 
Delphi 7 Professional
 
#26
  Alt 13. Aug 2010, 13:57
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
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#27
  Alt 14. Aug 2010, 16:14
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
Andreas
  Mit Zitat antworten Zitat
tferl

 
Delphi 7 Professional
 
#28
  Alt 16. Aug 2010, 12:26
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
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

 
FreePascal / Lazarus
 
#29
  Alt 16. Aug 2010, 12:42
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
Andreas
  Mit Zitat antworten Zitat
tferl

 
Delphi 7 Professional
 
#30
  Alt 16. Aug 2010, 23:18
...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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 21:08 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