strgalt Posted June 4, 2012 Share Posted June 4, 2012 Hallo zusammen, ich entwickle derzeit eine APP für die Boxee und benötige dazu u.A die Channels.dat. Deren Beschreibung habe ich bereits aus dem Downloadbereich geladen. Dennoch beliben ein paar Fragen offen und ich hoffe es kann mir da jemand weiter helfen. 1. Im DVBViewer werden einige Sender gruppiert, bsp. Pro 7 hat eine childnode "Pro Sieben (AC3), ARD HD hat drei childnodes, aber es gibt auch Sender wie VOX die haben keinen childnode. Leider kann ich an hand der channels.dat bsp. mit hilfe der forhandenen Felder nicht erkennen, welche Sendereintärge zusammen gehören. Einzige Möglichkeit währe nach meiner Beobachtung die service_id. Kann ich also die zusammengehörenden Einträge an Hand der service_id herrausfinden? 2. Beim Parsen der channels.dat sind mir Sendernamen aufgefallen, deren Länge die forgegebenen 25 Bytes übersteigt - im DVBViewer/RS werden die Namen jedoch korregt angezeigt. Beim Experimentieren mit der channels.dat habe ich dann festgestellt, dass der Rest des channelNamen im eventuell vorhandenen Rest des root- Feldes, getrennt mit einem Sonderzeichen, steht. Da das in der Doku so nicht aufgeführt wird, wollte ich sicher gehen, ob das so gehandhabt wird? Auch das Trennzeichen zwischen root und channelname würde mich interessieren? Vielen Dank Gruß strgalt Quote Link to comment
Griga Posted June 4, 2012 Share Posted June 4, 2012 Zu 1. Service ID geht, ist aber nicht 100% sicher - du müsstest zusätzlich Transportstream_ID und OriginalNetwork_ID überprüfen. Entscheidend ist das höchstwertige Bit 0x80 im Flags-Feld. Es besagt, dass es sich um einen Unterknoten bzw. eine Audiospur des letzten vorangehenden Senders handelt, bei dem dieses Bit nicht gesetzt ist. Zu 2. Da haben wir getrickst, um längere Namen unterbringen zu können, ohne die Feldgrößen und damit das gesamte Dateiformat ändern zu müssen. Gespeichert werden in den Feldern Root, ChannelName und Category Strings mit einem vorangestellten Längenbyte, die maximal 25 Zeichen lang sein können. Die Feldgröße beträgt also mitsamt Längenbyte immer konstant 26 Bytes. Wenn die Länge des Sendernamens 25 beträgt (also die maximale Länge), gibt es eventuell eine Fortsetzung im Root-Feld. Sie ist daran zu erkennen, dass sich direkt hinter dem Rootnamen (sofern er nicht das Feld selbst ausfüllt) ein Byte ungleich 0 befindet. Es gibt dann die Anzahl der nachfolgenden Zeichen an, die eine Fortsetzung des Sendernamens darstellen. Nach dem gleichen System kann der Kategoriename eine weitere Fortsetzung enthalten - es sind also beide zu überprüfen. Als Delphi-Code sieht das so aus: type TChannelStr = String[25]; PChannelStr = ^TChannelStr; function GetChannelName(const ch: TFileChannel): String; procedure AddFrom(const s: TChannelStr); var n: Integer; begin if Length(s) < SizeOf(TChannelStr)-1 then //less than 25 characters begin n := Length(s) + 1; //index of the byte after the string if (s[n] <> #0) and //another length byte following (n + Ord(s[n]) <= SizeOf(TChannelStr)-1) then //doesn't exceed the field result := result + PChannelStr(@s[n])^; end; end; begin with ch do begin result := ChannelName; if Length(ChannelName) = SizeOf(TChannelStr)-1 then //Length = 25 begin AddFrom(Root); AddFrom(Category); end; end; end; Etwas schräg, aber es funktioniert. Quote Link to comment
strgalt Posted June 4, 2012 Author Share Posted June 4, 2012 supi, danke für deine Antwort gruß strgalt PS: evtl kannst das ja für die Nachwelt noch in der Doku der channels.dat vermerken Quote Link to comment
strgalt Posted June 4, 2012 Author Share Posted June 4, 2012 Zu 1. nochmal. Ich muss wohl dazu sagen, dass es mir u.A. darum geht, den Port zum Streamen via RS zu ermitteln. So wie ich das sehe, werden nur die Sendereinträge vom RS verwendet, die entweder keine childnodes haben oder wenn eine childnode verfügbar ist, die erste davon? Und zu Sicherheit noch mal zur Erkennung von childnodes für mich: Service_id, Transportstream_id und originalnetworks_id müssen übereinstimmen. Der erste gefundene Eintrag ist die parentnode und die darauffolgenden mit den o.g. übereinstimmenden id´s sind dann die childs, wobei nur die erste im Port- Pool landet. Habe ich das so richtig verstanden? (Die Bit- Lösung passt so nicht in meine Codestruktur). Gruß strgalt Quote Link to comment
Griga Posted June 4, 2012 Share Posted June 4, 2012 Der erste gefundene Eintrag ist die parentnode und die darauffolgenden mit den o.g. übereinstimmenden id´s sind dann die childs, wobei nur die erste im Port- Pool landet. Mit dem RS kenne ich mich nicht aus, nur mit der Senderliste. Bei 3 übereinstimmenden IDs handelt es sich höchstwahrscheinlich um Unter-Einträge, aber nicht zwangsläufig, da man es mit etwas Gewalt auch hinkriegen kann, dass ein entsprechender Haupteintrag folgt. Es ist in der Senderliste kein Gesetz, dass Einträge, die zum selben Sender gehören, immer als ein einziger Haupteintrag mit Untereinträgen erscheinen. Zum Beispiel sind in der Standard-Astra-Senderliste die Audiospuren von EuroNews auf verschiedene Kategorien verteilt (je nach Sprache). Die Bit- Lösung passt so nicht in meine Codestruktur Das Flag ist die einzig absolut sichere Methode, wenn man die Struktur der Senderliste 1 zu 1 erfassen will. Du musst das Flag-Feld (als vorzeichenlosen Byte-Wert) nur auf größer gleich 128 testen: if Flags >= 128 then... //Bit 7 gesetzt, Untereintrag Quote Link to comment
strgalt Posted June 5, 2012 Author Share Posted June 5, 2012 ja, die Bits sind alle bereits ausgewertet. Hätte jetzt nur nicht reingepasst in die Structure wie ich mir das vorstelle - aber hatte das gestern noch mit dem Bit entsprechend sortiert. Es ging mir auch um das Verständnis, woran man erkennt welche Sender(Einträge) zusammen geören. Evtl. möchte ich die Darstellung der Sender später ja verändern. Da war ich eben ziemlich irritiert, dass in der channels.dat Sender- Parentnodes überhaupt Tuner/- Channeldaten haben, zumal diese nicht dem bevorzugten childnode entsprechen. Die aber vielen Dank für deine Geduld ! Gruß strgalt Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.