Grabben mit Java

Digital Recording
z3r0
Einsteiger
Einsteiger
Beiträge: 141
Registriert: Mittwoch 24. März 2004, 21:32

Grabben mit Java

Beitrag von z3r0 »

Hallo,

da ich was neues zum Spielen gebraucht habe, versuchte ich mich an ein paar Zeilen Code in Java, den Stream von der Box in eine Datei zu bringen. Ich habe mich an den 31338-Port gehängt und senden den Request mir nur den Ton zu liefern. Die Bytes werden gesendet und in eine Datei weggeschrieben. Als Protokoll benutzte ich TCP/IP. Wenn ich die Datei nun im Winamp abspiele hört sich das recht grausam an. Unter Linux zwar etzwas besser, aber trotzdem unbrauchbar.

Wenn ich mir die ganzen existierenden Grab-Engines ansehe, streamen die wohl alle mit dem UDP-Protokoll. Ist ein Streamen mit TCP nicht möglich?? Liegt es an der Programmiersprache? Hat schon jemand ähnliche Erfahrungen gemacht, und weiss eine Lösung? Ist der 31338-Port nicht eingenlicht ein TCP-Port?
leth
Einsteiger
Einsteiger
Beiträge: 350
Registriert: Sonntag 4. August 2002, 18:08

Beitrag von leth »

Hey, hab das auch schon auf Java probiert und keine Daten erhalten. Wenn ich das Ganze in VB.NET umsetzt, dann läuft es. Kannst Du mir den Code vielleicht mal zukommen lassen?

Cu leth
Nokia SAT 2xIntel
Baseimage V1.6
GandalfX vom 18.02.2003
Ucode_0014
-------------------------------------------
Das Recht auf Dummheit wird von der Verfassung geschützt.
Es gehört zur Garantie der freien Persönlichkeitsentfaltung.
z3r0
Einsteiger
Einsteiger
Beiträge: 141
Registriert: Mittwoch 24. März 2004, 21:32

Beitrag von z3r0 »

Ich habe zumindest Daten erhalten :)

Ich bin gerade in der Arbeit, könnte Sie dir heute Abend mailen. Oder bist du irgendwo im IRC unterwegs?
leth
Einsteiger
Einsteiger
Beiträge: 350
Registriert: Sonntag 4. August 2002, 18:08

Beitrag von leth »

Bin nicht im IRC unterwegs. Eine e-Mail wäre super! Die Adresse steht in meinem Profil.

Danke schon mal :-)

Wenn der Code auch bei mir läuft, dann kann ich vielleicht daran was ändern. Habe diesbezüglich bei der Programmierung einer Engine in VB.NET schon einige Informationen sammeln können.

Cu leth
Nokia SAT 2xIntel
Baseimage V1.6
GandalfX vom 18.02.2003
Ucode_0014
-------------------------------------------
Das Recht auf Dummheit wird von der Verfassung geschützt.
Es gehört zur Garantie der freien Persönlichkeitsentfaltung.
Sepp776
Semiprofi
Semiprofi
Beiträge: 1173
Registriert: Samstag 1. September 2001, 00:00

Beitrag von Sepp776 »

TCP geht auch. Die ersten Engines haben ausschließlich TCP verwendet. UDP ist aber besser geeignet, da zum einen auf Quittungen verzichtet wird und zum anderen der Header kleiner ist. Damit ist der Overhead geringer.
Wenn dein Netzwerk in Ordnung ist, solltest du auch keine nennenswerten Paketverluste haben, sodass die Qualität nicht schlechter als bei TCP ist.
Philips Sat
Astra 19.2°
z3r0
Einsteiger
Einsteiger
Beiträge: 141
Registriert: Mittwoch 24. März 2004, 21:32

Beitrag von z3r0 »

Aehm. Es funktioniert tatsaechlich. Zumindest konnte ich VIVA streamen, ganz ohne Aussetzer. Andere Sender muss ich nochmal probieren, vllt. hatte ich einen Sender erwischt, der etwas rumspinnt. Oder es liegt am Image, ich habe naemlich ein Neues draufgespielt., das Andere war schon seit einem Jahr drauf.

Nächster Schritt :)
So sieht z.B. mein Request aus ""GET /0x00ac HTTP/1.1\r\n\r\n"". Damit bekomme ich schon mal einen Ton.
Bei diesem Request ""GET /0x00ab /0x00ac HTTP/1.1\r\n\r\n"" dachte ich, ich wuerde Bild und Ton bekommen, aber weit gefehlt. Ich bekommen jetzt "nur" ein einwandfreies Bild. Nun meine Frage, muss ich zwei Threads starten und spaeter Bild und Ton in eine Datei zusammenfügen?

Ich kenne mich leider in diesem Bereich überhaupt nicht aus, wuerde aber gerne mit Java und JMF ein Glotztool programmieren, das plattformunabhaengig (Linux/Windows läuft) und alles aus einen Guss bietet, und nicht auf andere Programme angewiesen ist (mplayer, windows media player)
tha_haze
Einsteiger
Einsteiger
Beiträge: 249
Registriert: Samstag 8. Mai 2004, 20:14

Beitrag von tha_haze »

Die ganzen Musiksender senden mit so einer niedrigen Bitrate, dass man locker 2-3 gleichzeitig streamen könnte.

Ton/Video getrennt wird AFAIK schon passen, Stichwort "Packetized Elementary Stream"
z3r0
Einsteiger
Einsteiger
Beiträge: 141
Registriert: Mittwoch 24. März 2004, 21:32

Beitrag von z3r0 »

Ich konnte jetzt eigenltich alles streamen in sehr guter Qualität, ohne irgendwelche Aussetzer, und das mit Java und TCP/IP. War selbst verwundert wie einfach das eigentlich ging. Am Ende hatte ich 2 Dateien (PES-Files).

Habe mich jetzt ein wenig durchgelesen und weiss, das ich zu meinem Zweck einen PS-Stream brauche, den ich "on the fly" erzeugen muss. Diesen möchte ich mit Hilfe von (JMF) Java Media Framework in einem selbst gebauten Player wiedergeben. Leider habe ich bisher keine gute Doku gefunden, nach welchem Algorythmus ich vorgehen muss, um aus 2 PES-Streams einen zu erzeugen. Funktionieren muesste es, ggrab und wingrab machen das ja vor. Den ggrab-Code habe ich mir ein wenig angschaut, leider bin ich des c++ nich so maechtig.

Vielleicht mag mir ja einer helfen. Ich bin mit dem Tool soweit, das ich Streamen kann, die Box kontrollieren kann (zappen, EPG auslesen ...) und einen Java-Videoplayer habe ich auch, das alles in einer (hoffentlich) komfortablen Swing-GUI. Nur die Schnittstellen bereiten mir Kopfzerbrechen. An Ende wuerde ein absolut plattformunabhängiges Glotztool stehen.
tha_haze
Einsteiger
Einsteiger
Beiträge: 249
Registriert: Samstag 8. Mai 2004, 20:14

Beitrag von tha_haze »

klingt ja schon mal gut, nur wird das erzeugen eines Program Streams (PS) möglicherweise nicht so leicht. die informationen dazu wirst du dir irgendwo im internet zusammensuchen müssen, da diese nicht kostenlos sind.

ich selbst progge auch einiges mit java, möglicherweise kann ich dir ja helfen, falls es irgendwo sonst probleme gibt.

mfg haze
tha_haze
Einsteiger
Einsteiger
Beiträge: 249
Registriert: Samstag 8. Mai 2004, 20:14

Beitrag von tha_haze »

z3r0
Einsteiger
Einsteiger
Beiträge: 141
Registriert: Mittwoch 24. März 2004, 21:32

Beitrag von z3r0 »

Danke für die Links! Die waren sehr hilfreich. Ich bin zwar (hoffentlich) schlauer geworden, manche Fragen beiben aber trotz des Wühlens in den ISO es unbeantwortet. Ich müsste erst mal ein paar fundamentale Sachen verstehen, bevor ich soweit ins Detail runter kann.

Zum Beispiel dieses Stück Stream aus einem Hex-Editor

00 00 01 E0 08 0E 80 00 0B FF FF FF FF FF FF FF FF FF FF FF DA E8 C9 0B 9D A3 55 0C C8 1D 3F FE 23 DE 27 41 1A D4 41 BA B4 99 A1 7C D1 9A 7B DD D2 EC 18 AD 44 C9 C3 CD BB C6 A8 A3 9C 1F 1F

00 00 01 ist klar, das ist der Startcode
E0 ist die Stream-Id und steht fuer einen Video-Stream
08 0E steht fuer die Länge PES-Packets ab Byte NR. 6

Mit dem Rest habe ich mich noch garnicht beschäftigt. Nun meine Fragen, vielleicht erbarmt sich jemand und kann mir das näher bringen.

1. Zwischen dem ersten (00 00 01 E0) und dem nächsten Abschnitt sind ca 20-30 andere (z.B. 00 00 01 11, 00 00 01 12, .... ) Byte-Abschnitte. Können diese ignoriert werden?? Sind das sogenannte GOP es?? Gehoert die alle noch zu einem PES-Paket oder sind das Einzelne??

2. Was gehoert alles zum PES-Header, braucht man den PES-Header im späteren PS-Stream oder muss da was rausgeschmissen werden?

3. Wie setzt sich der PS-Stream zusammen?? Ich weiss nur was von einem Pack-Header und den darauffolgenden PES-Paketen.
tonsel
Erleuchteter
Erleuchteter
Beiträge: 536
Registriert: Freitag 21. September 2001, 00:00

Beitrag von tonsel »

Google-Suche:
11172-3.pdf -> MP2-Audio
is138181.pdf -> Aufbau PES/PS/TS
is138182.pdf -> Video-Codierung

Ich hab' mehrere Monate gebraucht um den ersten Muxer in mkdvd fertigzustelen, der nur fehlerfrei Streams bearbeiten konnte. Also viel Spaß!

zu 1) Das sind die sog. Slice-Header des Videos, die braucht man nicht. Dafür aber nich div. andere z.B. die Picture-Header.

zu 2) Den PES-Header aus dem DBox-Stream brauchst Du nicht, Du musst im PS neue Header mit neuen Zeitstempeln generieren.

zu 3) Einfach mal einen kurzen Stream mit Wingrab muxen und per Hex-Editor vergleichen (Tip: mit hexdump ein Textfile erzeugen das man per Texteditor absuchen kann). Dann systematisch alle MPEG Start-Codes in der Norm nachlesen - Eine Abkürzung gibt es nicht.

Nenbei: das Muxen waren dann der einfache Teil. Viel schwieriger ist es mit fehlerhaften Streams zurechtzukommen.

tonsel
tha_haze
Einsteiger
Einsteiger
Beiträge: 249
Registriert: Samstag 8. Mai 2004, 20:14

Beitrag von tha_haze »

Schön zu sehen, dass sich da noch was weitergeht bzw. überhaupt das sich jemand engagiert.

Das mit den Fehlern im Stream könnte vielleicht doch schwierig sein, muss aber nicht. Vielleicht schluckt das JMF ja aber auch diese Fehler.

Mein Angebot dir zu helfen steht übrigens noch, sei es mit Java oder auch mit einer Webseite zum Tool (hab auch bezahlten Webspace mit Domain).

mfg haze
leth
Einsteiger
Einsteiger
Beiträge: 350
Registriert: Sonntag 4. August 2002, 18:08

Beitrag von leth »

Bezüglich MPEG2 solltest Du Dir vielleicht auch mal Project-X ansehen, da wurden vermutlich schon einige IOS-Normen umgesetzt, welche auch Du benötigen wirst. Und der größte Vorteil ist vermutlich, dass es komplett in JAVA geschrieben ist :-)

Cu leth
Nokia SAT 2xIntel
Baseimage V1.6
GandalfX vom 18.02.2003
Ucode_0014
-------------------------------------------
Das Recht auf Dummheit wird von der Verfassung geschützt.
Es gehört zur Garantie der freien Persönlichkeitsentfaltung.
z3r0
Einsteiger
Einsteiger
Beiträge: 141
Registriert: Mittwoch 24. März 2004, 21:32

Beitrag von z3r0 »

Google-Suche:
11172-3.pdf -> MP2-Audio
is138181.pdf -> Aufbau PES/PS/TS
is138182.pdf -> Video-Codierung
Die ISO es habe ich alle angeschaut. An manchen Stellen bleibe ich trotzdem haengen, habe leider niemenaden den ich gleich fragen kann :)
Ich hab' mehrere Monate gebraucht um den ersten Muxer in mkdvd fertigzustelen, der nur fehlerfrei Streams bearbeiten konnte. Also viel Spaß!
Zu meiner Schande muss ich gestehen, ich wusste nicht das udrec eine mplex-Funktion hat. Gut das du es erwähnt hast. Habe mir gleich die Sourcen gesaugt. Da es in c# programmiert ist, und mir der Programmierstil eher entgegenkommt als PX, überlege ich einfach nur die -mplex-Funktion zu portieren. Vielleicht haettest du ja auch Interesse daran? Die neue JtG-Version soll ja auch in Java sein.
zu 1) Das sind die sog. Slice-Header des Videos, die braucht man nicht. Dafür aber nich div. andere z.B. die Picture-Header.
Kann ich die Slice-Header drinlassen?? Warum sind die Picture-Header interessant?? Muss man soweit runtergehen?
zu 2) Den PES-Header aus dem DBox-Stream brauchst Du nicht, Du musst im PS neue Header mit neuen Zeitstempeln generieren.
Anstatt den PES-Header?? Bekommt jedes bestehende PES-Paket nun einen PS-Header?
zu 3) Einfach mal einen kurzen Stream mit Wingrab muxen und per Hex-Editor vergleichen (Tip: mit hexdump ein Textfile erzeugen das man per Texteditor absuchen kann). Dann systematisch alle MPEG Start-Codes in der Norm nachlesen - Eine Abkürzung gibt es nicht.
Ich werde morgen mal versuchen mit udrec die multiplex-Funktion von Anfang bis zum Ende zu debuggen. Evtl verschafft das mehr Klarheit.
Nenbei: das Muxen waren dann der einfache Teil. Viel schwieriger ist es mit fehlerhaften Streams zurechtzukommen.
Vielleicht gehts ja doch einfacher :)
tonsel
Erleuchteter
Erleuchteter
Beiträge: 536
Registriert: Freitag 21. September 2001, 00:00

Beitrag von tonsel »

Ich habe oben den Muxer von MKDVD erwähnt. In udrec ist nur erst ein halb fertiger Muxer drin. Die -mplex-Option gibt nur die Perameter für das Linux-mplex aus.

tonsel
z3r0
Einsteiger
Einsteiger
Beiträge: 141
Registriert: Mittwoch 24. März 2004, 21:32

Beitrag von z3r0 »

Schade, waere wohl zu einfach gewesen.
miller_bln
Interessierter
Interessierter
Beiträge: 46
Registriert: Dienstag 29. Juli 2003, 19:51

Beitrag von miller_bln »

ich habe auch das problem, daß der mpeg-stream , der von der dbox mit streampes raw empfangen wird, mit
keinem viewer anzusehen ist...egal ob vlc oder oder mplayer oder sonstwas.
erst wenn ich das teil mit projectx bearbeite, kann ich die mpv-datei mit vlc
anschauen.

ich habe mir auch die hex-streams angeschaut und daraufhin eine routine
geschrieben, die ab dem code '00 00 01 E4' bis zum nächsten '00 00 01 B3'
alles rausschmeißt , wie es projectx auch gemacht hat.
erfolg: es wird vom vlc zwar ein window geöffnet aber ein bild ist immer noch nicht zu sehen.

wer weiß, was da noch fehlt ????

wäre schön, wenn ich das endlich mal in den griff bekomme :roll: :roll:
miller_bln
Interessierter
Interessierter
Beiträge: 46
Registriert: Dienstag 29. Juli 2003, 19:51

Beitrag von miller_bln »

wow...die seite ist ja super.

nach diesen codes habe ich schon mehrer tage gegoogelt und nix gefunden.

DANKE tha_haze !!!!!

:D :D :wink: :wink:
tha_haze
Einsteiger
Einsteiger
Beiträge: 249
Registriert: Samstag 8. Mai 2004, 20:14

Beitrag von tha_haze »

miller_bln hat geschrieben:
wow...die seite ist ja super.

nach diesen codes habe ich schon mehrer tage gegoogelt und nix gefunden.

DANKE tha_haze !!!!!

:D :D :wink: :wink:
naja ich glaub bei mir waren es nicht ganz 10min :wink:
miller_bln
Interessierter
Interessierter
Beiträge: 46
Registriert: Dienstag 29. Juli 2003, 19:51

Beitrag von miller_bln »

tha_haze hat geschrieben: naja ich glaub bei mir waren es nicht ganz 10min :wink:
naja..hmm..ähmm...die österreicher denken ein wenig einfacher :-? :-?

ich hab nach den einzelnen codes gesucht (0x01b3 etc) und du hast vermutlich
nach einem oder mehreren oberbegriffen gesucht :D :D

aber egal..nun hab ichs ja auch :P :P
z3r0
Einsteiger
Einsteiger
Beiträge: 141
Registriert: Mittwoch 24. März 2004, 21:32

Beitrag von z3r0 »

Kleine Statusmeldung: Das ist richtig fies!! :)

Im Video-PES-Header werden wohl keine Paketlängen mitgeliefert. Es ist ziemlich unperformant jedes Byte abklappern zu muessen um den Stream in PES-Pakete aufteilen zu können, da muss man aber wohl durch. Habe jetzt auch eine Schleife fertig, die den Stream ausliest, in PES-Pakete splittet und diese Pakete (testweise in eine Datei) wegschreibt.

Abgesehen davon dass das File nicht abspielbar ist (direktes Wegschreiben schon), gibt es wohl Lücken im Stream. Ich dacht irgendwo gelesen zu haben , das ein PES-Paket maximal 65536 Bytes gross ist. Kommt leider immer wieder vor, das der dafuer angelegte Puffer überläuft. Das sind dann evtl die von tonsel angesprochenen fehlerhaften Streams?

Warum ich das schreibe? Vielleiht kommt nochmal jemand auf die Idee sich auf so ein Abenteuer einzulassen, dann kann er davon profitieren :)
tonsel
Erleuchteter
Erleuchteter
Beiträge: 536
Registriert: Freitag 21. September 2001, 00:00

Beitrag von tonsel »

DVB-Video-PES haben i.d.R. Pakete die größer als 64Kb sind, denn jedes Paket entspricht einem Bild und eine I-Frame ist nunmal oft größer als 64Kb.
Deshalb stehen im PES-Header auch keine Paketlängen, weil das Feld dafür zu klein ist.

Streamfehler kommen meistens durch Empfangsstörungen zustande.

tonsel