Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 22:42

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Audio/Video Codecs decodieren
BeitragVerfasst: Fr Okt 30, 2009 12:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich will demnächst mal wieder nach sehr langer pause an meinem Flipbook weiterarbeite (die portierug nach C++) und überlege da grade ob ich das Video/Audio system abändern soll/will.

Bisher wird das ganze über plugins gelöst (wird natürlich auch weiterhin so bleiben) wo es dann z.B. ein Plugin für QuickTime gibt welches halt das QuickTime SDK verwendet zum decoden.. ein anderes nutzt z.B. ffmpeg etc. so das hat für jedes Video/Audio format irgendein plugin da ist.

Das hat den vorteil das mehr oder weniger jedes video format unterstüzt wird, aber ich mal wieder a) stark auf FremdLibs/SDKs angewiesen bin und b) ich nichts über die codecs lerne ;)


Da ja mittlerweile immer mehr ContainerFormate auf den Markt kommen (MOV, MP4, MKV, AVI..) will ich dafür meine unterstützung im Flipbook besser machen, also wirklich alle Streams auslesen die in der Datei sind und dem User zum abspielen anbieten.. das geht zwar natürlich auch wieder einfach über die SDKs etc., aber:

Es sind ja nur container.. die container Formate sind in der regel nicht so kompliziert aufgebaut so das diese relativ einfach von hand ausgelesen werden können und ich mir dann dementsprechend einfach die Streams raus extrahieren kann. Ich habe dann also z.B. einen VideoStream im h264 format und einen Audiostream im AAC format..

Jetzt überlege ich "Was tue ich damit?" - denn... entweder ich schreibe eigene decoder für die Formate, was aber durchaus aufwändig werden dürfte (+ bei einigen nicht freien formaten unmöglich + Patent Probleme).. oder alternativ muß ich irgendwie die Streams dekodieren, aber so wie ich die meisten SDKs und Libs kenne können sie in der regel nur halt die komplette datei an sich decodieren und wiedergeben...

Nichts desto trotz würde ich gern ein paar Formate selbst decodieren. Einfach aus lern und interessens zwecken, aber da frage ich mich:
Wie aufwändig ist es, und gibt es da überhaupt brauchbare infos zu..? Im speziellen z.B. h264 und AAC.. oder MP3..


Aya~

PS: Es gibt ja für delphi diese GraphicEx library die extrem viele Bildformate lesen kann... wie hat der Autor davon (ich glaube Mike Lischke) es dort eigentlich gemacht..? Auch alle möglichen libs benutzt oder wirklich jedes Format von hand implementiert..?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 30, 2009 14:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Du kannst ja 2 ServiceLocator verwenden, der erste wäre für Formate wie jpeg, zip, mkv, avi und so weiter und der 2. wäre Encoder/Decoder also mpeg2, divx, jpeg, vorbis, theora und so weiter. über std::iostream, std::ostream und std::istream kannst du dann das ganze recht abstrakt und platformunabhängig hin und her reichen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 31, 2009 13:07 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ja das ist ein sehr interessantes Thema, welches mich ebenfalls interessiert.

Meine versuche damals mit RIFF (AVI) hatten schon gereicht.

Jedes Containerformat hat da seine eigenheiten wie man die "Codecs" erkennt,
die verwendet werden. Die einen nehmen FourCC, die anderen nehmen die GUIDS, die anderen Int Kombinationen.....

Da es für einige Formate (WMV, MP4) keine richtige Format Definition gibt muss man da raten,
oder halt per Hex solange rumprobieren, bis man das "Schema" erkennt.

Man kann sich höchstens am Quellcode von anderen Projekten wie FFMPEG orientieren um zu gucken,
wie die es gemacht haben. Wobei die dann wieder alles andere beachten (Little/Big Endian, MMX, SSE etc.) Technologien
und ja alles mit ASM damit mans nicht lesen kann :D



Ich glaube es wäre schon cool wenn man die ganzen Container Formate auslesen könnte,
und die Streams / Codecs erkennt.

Nur wirds da grenzen geben, wie z.b. bei DVD/Blu-Ray/WMV/RM etc.
Da diese Formate mittlerweile so kompliziert sind, das es nur mit Kommerzieller Software,
oder "Freak" (VLC, Gabest) Software verwendet werden können.



Was aber keinen Sinn macht, in meinen Augen jeden einzelnen Codec selbst zu schreiben.
Wenn man da ein Codec für "lernzwecke" selbst schreibt, ist das ja ok.

Aber ich will sehen wie du nen brauchbaren H.264 codec schreibst,
der nahezu perfekt funktioniert und noch dazu "Multithreaded" arbeitet und schnell ist.
Ich finde da gibt es schon genug fertige und meiner meinung nach "Gute" sachen wie z.b.

Core AVC - Ich kann damit bei 1.6 GHz (Atom) und 2 GB ram 1080p Flüssig abspielen. (Nutzt Nvidia Cuda was ähnlich wie dieses DirectCompute und OpenCL ist) Leider ist der Codec Directshow somit nur unter Windows nutzbar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 31, 2009 13:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Die großen bekannten Container für Video sind avi, mpg und mkv. Diese sind durch den FourCC alle auslesbar und das ist der Weg, den ich gegangen bin. Ich assoziiere in meinem DecoderServiceLocator einmal Dateinamen extension und FourCC also jeder DecoderService enthält ein FourCC und Ext, ob diese gesetzt sind legt das Plugin fest.
Meine Files werden durch ein Interface IResource abgeleitet, welches eine Funktion bool IsDecodeable(); in den std::ostream Src; die ersten 4 Bytes lesen geht und sollte ein match mit der Liste im DecoderServiceLocator geben, dann super sonnst prüft er noch ob der Sourcename eine Datei ist und ob diese eine Extension besitzt, welche noch geprüft werden kann.
Extensions sind 2. Wahl, da ich auch ein avi .mpg nennen kann oder ein divx .avi und die laderoutinen würde amok laufen, wenn man nicht den Inhalt vorher noch validiert.
FourCC hatte Microsoft eingeführt, um ihre Datein validieren zu können und Linux und andere OS haben das auch sofort übernommen und ich kenne eigentlich heute kein Format mehr, was kein 4CC hat, denn selbst XML files haben ein 4CC unzwar "<xml" das ist in den specs festgelegt, das die ersten 4 Zeichen einer XML file <xml sein müssen, sonnst entspricht sie nicht dem korrekten syntax(wird trotzdem von allen readern problemlos erkannt und übersetzt). Wenn die 4Bytes raus sind und ein passender Decoder gefunden wurde, dann kann der Decoder selber eine Funktion ReadInformationHeader ausführen, welcher dann halt von dem jeweiligen Format den Header liest und dann kann man auch schauen ob es ein Container ist oder nicht. Auf der IDecoder abstraktionsebene kann man nur als Bytearray auf den Informationsheader zugreifen, man muss also erst ein dynamic_cast<Decoder...*>(MyDecoder) machen um dann wirklich sinnvoll die Informationen zu lesen. Also einfach gesagt gibt es bei mir ein IResource und IDecoder/IEncoder welche im ersten Fall eine Resource egal ob Datei, Netzwerkstream oder ein Device ist und 2. dann die niedrigste Ebene zum umwandeln der Daten in Interne Datenstrukturen. Für Video und Bild habe ich eine einzige Klasse Image, diese kann Frames, MipMaps enthalten und lehnt sich sehr nahe der .Net Variante.

Es ist auch möglich, die erkennung von fremdbibliotheken machen zu lassen, Gnome nutzt z.B. eine Mime Lib, die dann die File anguckt und dir sagt was es für ein Typ ist aber das Hilft beim Codec wenig :\

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 01, 2009 09:04 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Kleine Korrektur zum XML ... das sollte besser "<?xml" sein... ;) Aber das Prinzip bleibt ja das gleiche.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Audio/Video Codecs decodieren
BeitragVerfasst: Mo Nov 02, 2009 14:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ja das stimmt '<?xm'. Die XML Specs. sagen eine XML file muss mit XMLDecl anfangen welches mit '<?xml ' beginnt und dann VersionInfo und andere nicht verpflichtende parameter und zum schluss '?>' besteht. Es dürfen keine Zeichen vor '<?xml' stehen und daraus baut sich dann der FourCC '<?xm'. Wenn man w3 xml files strict prüft fallen viele xml files durch, weil noch kommentare, Umbrüche oder Leerzeichen davor stehen. Die Parser interessiert allerdings nur, dass der text well-formed ist und nicht valid.

Matroska ist auch nur der Codec und nicht das Containerformat, denn dies ist EBML.
Welches übrigens sehr gut gelungen ist, wie ich finde.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]