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..?
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
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
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.
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
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
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.