Hallo zusammen, ich muss für mein Praktikum einen FPGA (Altera) auf VHDL-Basis programmieren, was nicht das größte Problem darstellt. ;-( Über den "Expansion Header" meines Altera DE2-115 bekomme ich das 8-Bit Signal meines MPEG-2-Datenstroms. Es handelt sich dabei um den Transportstrom eines DVB-S-Signals, dass mehrere Sender überträgt. Ziel ist es einen bestimmten Sender im Datenstrom zu identifizieren und dann via VGA (oder LCD...) auszugeben. Jedenfalls tue ich mich schwer, den 8-Bit Transportstrom von der Struktur hier zu verstehen. Vielleicht kann mir jemand ein paar Links zu bereits existierenden VHDL-Beispielen mit einem MPEG-2-TRansportstrom posten? Literatur zum MPEG-2-TRansportstrom habe ich schon (Digitale Fernseh- und Hörfunktechnik in Theorie und Praxis von Walter Fischer), aber vielleicht gibt es noch bessere Literatur, die noch mehr auf die "Bit-Ebene" eingeht... Liebe Grüße Mike...
Mike schrieb: > die noch mehr auf die > "Bit-Ebene" eingeht... diese spielt doch eigentlich keine Rolle. Es kommen doch immer 188 byte als ein Packet an. Diese Packet eine ID (PID). Zum anzeigen von eines Senders braucht du die id vom Ton und Vom Bild. Entweder gibt du sie im code vor oder du musst erst noch die PAD auswerten. Danach hast schon mal mal den Transportstrom eines Senders. Wie es jetzt weiter geht hängt davon ab welches Format den MPEG codierer braucht. Eventuell muss die die TS packet noch einen MPEG stream muxen.
Hallo Peter II, im Grunde hast du Recht, aber ich möchte ja nicht den Sender wiedergeben, sondern nur den Sendernamen auslesen. Soweit ich es in Erfahrung gebracht habe, muss ich dazu die Service-Description-Table (SDT), die anscheinend den Namen des Senders als Table mitführt, auslesen... Oder liege ich falsch? LG
Mike schrieb: > ondern nur den Sendernamen auslesen. Soweit ich es in > Erfahrung gebracht habe, muss ich dazu die Service-Description-Table > (SDT), die anscheinend den Namen des Senders als Table mitführt, > auslesen... ja, wenn du nur den namen anzeigen willst. Dafür musst du nur die Packet für die SDT verwenden. Diese hat eine feste ID. Mache das ganze doch erstmal am PC, einfach eine DVB karten rein und den Datenstrom aufnehmen, dann kannst du dir mal die packet in ruhe anschauen.
wiki: http://de.wikipedia.org/wiki/Transportstrom PAT PAT steht für Program Association Table. Die PAT listet alle PIDs für alle PMTs im Strom. Pakete, die die PAT-Information enthalten, haben immer die PID 0x0. PMT Die Program Map Table, (PMT) enthält Informationen über die Programme. Für jedes Programm gibt es eine PMT, assoziiert mit seiner eigenen PID. Die PMTs beschreiben, welche PIDs Daten für das Programm enthalten. PMTs stellen ebenso Metadaten für die Streams und ihre einzelnen PIDs bereit. Zum Beispiel sind bei einem Programm, bestehend aus einem MPEG-2-Videostrom, die PID des Videostreams und zusätzlich die Art der Daten, also in diesem Fall MPEG-2, enthalten. Die PMT kann außerdem zusätzliche Deskriptoren zur Beschreibung der einzelnen Ströme enthalten. also erst die PAT auswerten und dann mit diesen Infos die PMT.
ok, ich danke dir... möchte erst einmal die SDT auslesen. In dem Dokument, das du mir gepostet hast, wird der Aufbau der SDT beschrieben (siehe Bild). Was genau bedeuten die Schleifen mit "j" und "i"? Vielen Dank für die Unterstützung... Liebe Grüße Mike...
Mike schrieb: > Was genau bedeuten die Schleifen mit "j" und "i"? das es hier N-Stück dieser einträge gibt.
=) Das habe ich mir auch schon gedacht... Vielleicht habe ich meine Frage zu ungenau gestellt: 1. In welchen Bit/Byte steckt die Information über j und i? 2. In welchem Teil kommt dort der Payload? Nach der Checksumme? LG
Mike schrieb: > 1. In welchen Bit/Byte steckt die Information über j und i? i und j sind nur hilfevariabeln. Die Frage ist woher du N bekommst. Ich weiss es nicht mehr genau. Aber ich vermute mal das es section_length und descriptor_loop_length ist. > 2. In welchem Teil kommt dort der Payload? Nach der Checksumme? nein die checksumme ist bei jedem TS packet am ende. Die kannst du also ohne wissen über den Inhalt prüfen.
Hallo Peter II, du weißt gar nicht, wie dankbar ich bin mit jemanden über die Sache reden zu können der Ahnung von der Materie hat. Endlich Licht am Ende des Tunnels... ;-) 1. Ok, section_length macht Sinn, da ja sehr warscheinlich mehrere Sender übertragen werden. Aber warum eine Loop für den Service Descriptor, der ja nur für einen Sender gilt. Der Content des Service-Descriptor ( z.B. Service Provider Name) muss ja theoretisch nur einmal übertragen werden. Ein 2. Mal würde ja keinen Sinn machen, der Name ändert sich ja nicht mehr... 2. Was passiert, wenn die Table über 188 Byte hinaus geht`? Wird dann einfach nach dem letzten Bit des Paketes in der Tabelle abgebrochen und nach dem "Header" der Service Description Section das nächste Bit einfach wieder aufgenommen? Oder wird in jedem TS-Paket mindestens die Infos eines Senders übertragen und der REst des Paketes, falls es für eine weitere Service-Loop nicht reicht, einfach ungenutzt übertragen? LG
Mike schrieb: > Aber warum eine Loop für den Service > Descriptor, warum schaust du es dir nich mal in der Praxis an, eventuell klärt es sich ja dann schon. > Was passiert, wenn die Table über 188 Byte hinaus geht`? es gibt doch das flag am fang der Packetes, darin ist doch enthalten ob das packet weiter geht oder nicht. Du musst vorher überlappende packete zusammenbauen. mach es in mehre schritten 1. Empfang einen 188byte packets 2. Brauche ich das packet (auswertung der PID) 3. Stimmt die checksumme 4. extrahieren des contents, wenn nicht vollständig auf das nächste packet warten) 5. Auswertung des Contents
Für Linux gibt es dvbsnoop, dvbstream. Vielleicht sind diese Tools auch in Deinem Fall nützlich.
Ich danke euch für die hilfreichen Antworten. Habe mir nun einen Ausschnitt eines ts-streams besorgt und analysiere ihn gerade. Finde aber leider kaum Infos über die Berechnung der Checksumme. Kann mir da jemand sagen, wie diese berechnet wird? Liebe Grüße Mike
Mike schrieb: > Finde aber leider kaum Infos über die Berechnung der Checksumme. merkwürdig, google findet einiges: http://forums.dvbowners.com/index.php?showtopic=10773
Hallo Peter, danke dir, habe wohl einfach mit den falschen Keywords gesucht.. Bin nun dank meines Ts-Files um einiges weiter gekommen und habe mir die SDT-Pakete mal genauer mit einem hex-viewer angeschaut. Dabei sind 2 Fragen aufgekommen: 1. Warum wird für die Übertragung der SDT 2 verschiedene Table-IDs verwendet? 2. Bei der Übertragung der 188-Byte pakete der SDT ist mir folgendes aufgefallen: Der Header besteht (ohne Adaptionfield) aus 4 Bytes, danach sollte nach der Literatur sofort die Table_Id folgen (Fall 1), oder (Fall 2) an der Stelle, wo das letzte Packet unterbrochen wurde, weiter die Infornationen der letzten Table übermittelt werden. Fall 2 ist auch nachvollziehbar. Bei Fall 1 folgt jedoch dem 4Byte-Header ein 0x00 und danach kommt erst die Table_Id 0x46. Beispiel aus dem Hex-Code meines TS-Streams: 47 40 11 10 00 46 ... Beginn der Table... Ist das so normal? LG MIke...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.