grovel
Beiträge: 469

Tutorial: Mehrsprachige-Menus erstellen mit Encore und PgcEdit.

Beitrag von grovel »

Herzlich willkommen,

Dieses kleine Tutorial richtet sich an alle fortgeschrittenen DVD-Autoren, welche nicht das Geld für Sonic-Scenarist ausgeben könne, aber trotzdem ganz gerne mehrsprachige Menus auf ihren DVDs haben, und zwar ohne dass der Benutzer jedesmal auf eine Flagge oder einen anderen Sprachauswahlbutton klicken muss. Schliesslich bietet (fast) jeder DVD-Player die Möglichkeit, eine bevorzugte Menusprache einzustellen.

Eine Warnung hier gleich zu Beginn. Wir müssen dafür direkt in die DVD-Struktur eingreifen, buchstäblich hacken. Die Vorgehensweise wird hier anhand einer extrem simplen DVD aufgezeigt, komplexere DVDs würden auch komplexere Hacks erfordern - mit ein bisschen Geduld lässt sich allerdings fast jede DVD umbiegen und abändern. Ich gehe allerdings davon aus, dass man ein rudimentäres Programmierwissen mitbringt, begriffe wie "if, call, goto, set" sollten klar sein.

Die fertige DVD findet man hier:
http://rapidshare.de/files/21971808/PGC ... t.zip.html
Im darin enthaltenen VIDEO_TS-Ordner gibt es auch einen Backup-Ordner, wenn man dessen Dateien in den VIDEO_TS-Ordner gibt, so erhält man die Ausgangs-DVD.

1) Als erstes habe ich ein simples DVD-Projekt in Adobe Encore erstellt. Es besteht aus einer Timeline (fünf Sekunden, dafür aber dreisprachig und mit drei Untertiteln) und vier Menus. Das Haupt-Menu (firstplay) zur Sprachauswahl (welches wir erst noch einbauen um es dann später zu umgehen) und einem Menu für jede Sprache.
Im Flussdiagramm sieht das dann folgendermassen aus:

Die Original-Ausgangsdateien und Encore-Dateien kann man sich hier herunterladen, wenn gewünscht (Notwendig fürs Projekt sind sie nicht):
http://rapidshare.de/files/21972314/pro ... n.zip.html

2) Nachdem wir nun eine funktionierende DVD, aber mit nervendem und laut DVD-Standard überflüssigem Anfangsmenu haben, laden wir erstmal PgcEdit herunter. Diese freie Tool, mit dem man bereits geauthorte DVDs noch nachbearbeiten kann findet sich hier:
http://www.videohelp.com/~r0lZ/pgcedit/
Wir starten das Programm, gehen auf "File->Open DVD", öffnen den in Encore erstellten VIDEO_TS-Ordner und schliessen den erscheinenden Info-Dialog mit "Close". Dann erhalten wir so ungefähr das hier:

Jetzt sind wir wahrscheinlich erst mal überfordert, aber das ist egal, deshalb hier eine kleine Einführung in diejenigen Funktionen von PgcEdit welche wir für unser Vorhaben benötigen.
Im linken Teil des Fensters sehen wir die PGC-Struktur der DVD, im rechten Teil die Skript-Befehle des ausgewählten PGCs, dies sollte Aktuell der First-Play-PGC sein. Jeden Befehl kann man mit einem einfachen Doppelklick bearbeiten, Syntax-Errors sind so fast unmöglich.
Das tollste ist aber der Trace-Modus, damit kann man Schritt für Schritt die DVD abspielen und sehen, was genau passiert. Gestartet (und gestoppt) wird der Modus mittels Ctrl+T. Klicken wir auf "Watch" so erhalten wir ein Übersichtsfenster, welches die verschiedenen Variablen, auf welche eine DVD zugreifen kann angezeigt werden.
Hier gibt es z.B. die SPRMs welche Systeminformationen speichern, von ihnen ist nur jene mit der Nummer 0 relevant, denn sie speichert die bevorzugte Sprache des Abspielgerätes. Mittels "Help->ISO639 Language Codes" erhalten wir auch eine Liste, welche uns mitteilt, welche Sprache welcher Nummer entspricht. Für mich relevant sind Deusch, Französisch und Englisch, respektive in Zahlen 25701, 26226 und 25966.
Im Watch-Dialog sieht man auch wie sich die GPRM-Variablen verändern - in ihnen kann eine DVD beliebige Infos speichern, meist zur Navigation. Encore braucht bei simplen DVDs immer nur die Variable 15. Da wir selbst bei einer hochkomplexen DVD aber nur im Startstadium Dinge verändern werden, ist nur jene Variable interessant, bzw. auch noch Variable 14 welche wir für eigene Zwecke misbrauchen.

3) Ok. Beginnen wir. Da wir die DVD ja nur einmal beim Aufstarten ändern wollen, müssen wir uns auf die Suche machen, auf den letzten Befehlsblock der Startroutine. Glücklicherweise ist das immer der letzte Block des VMGM-Blockes, so wie oben angezeigt im Screenshot. Wenn wir ihn Rechtsklicken und mittels "Go to Calling Command" überprüfen, wer auf ihn verlinkt, sehen wir, dass er nur direkt von der First-Play-Routine aufgerufen wird. Er selbst ruft das Root-Menu in VTSM 1 auf, welches aber auch von zig andern Routinen in Anspruch genommen wird. Hier ist es alos, wo wir unsere Änderungen einfügen müssen.

4) Nur was für Änderungen. Wenn wir uns im Trace-Modus bis zum Root-Menu durcharbeiten, sehen wir, dass an dessen Anfang die GPRM-15-Variable auf 1 steht. Da sie dadurch grösser als 0 ist werden wir direkt zum zweiten PGC-Block weitergeleitet (man beachte die IF-Verknüpfung). Der zweite Block ist wesentlich komplexer:
[img=http://img267.imageshack.us/img267/5521 ... 9rw.th.jpg]

Code: Alles auswählen

[00 C1 00 0F 00 09 00 28]   1  if ( gprm(15) >= 9 ) then { Goto line 40 } 
[00 C1 00 0F 00 05 00 15]   2  if ( gprm(15) >= 5 ) then { Goto line 21 } 
[00 C1 00 0F 00 03 00 0C]   3  if ( gprm(15) >= 3 ) then { Goto line 12 } 
[00 C1 00 0F 00 02 00 08]   4  if ( gprm(15) >= 2 ) then { Goto line 8 } 
[71 00 00 0F 00 00 00 00]   5  Set gprm(15) =(mov) 0 
[56 00 00 00 04 00 00 00]   6  (SetHL_BTN) Set Highlighted Button =(mov) 1024 (button 1) 
[20 04 00 00 00 00 00 06]   7  LinkPGCN PGC 6 
[71 00 00 0F 00 00 00 00]   8  Set gprm(15) =(mov) 0 
[51 00 00 00 80 00 00 00]   9  (SetSTN) Set Sub-picture stream = 0, off 
[71 00 00 0D 00 01 00 00]  10  Set gprm(13) =(mov) 1 
[30 05 00 01 00 01 00 00]  11  (JumpVTS_PTT) Jump to TTN 1, Chapter 1 
[00 C1 00 0F 00 04 00 11]  12  if ( gprm(15) >= 4 ) then { Goto line 17 } 
[71 00 00 0F 00 00 00 00]  13  Set gprm(15) =(mov) 0 
[51 00 00 82 00 00 00 00]  14  (SetSTN) Set Audio stream = 2 
[71 00 00 0D 00 02 00 00]  15  Set gprm(13) =(mov) 2 
[30 05 00 01 00 01 00 00]  16  (JumpVTS_PTT) Jump to TTN 1, Chapter 1 
[71 00 00 0F 00 00 00 00]  17  Set gprm(15) =(mov) 0 
[51 00 00 00 C2 00 00 00]  18  (SetSTN) Set Sub-picture stream = 2, on 
[71 00 00 0D 00 03 00 00]  19  Set gprm(13) =(mov) 3 
[30 05 00 01 00 01 00 00]  20  (JumpVTS_PTT) Jump to TTN 1, Chapter 1 
[00 C1 00 0F 00 07 00 1F]  21  if ( gprm(15) >= 7 ) then { Goto line 31 } 
[00 C1 00 0F 00 06 00 1B]  22  if ( gprm(15) >= 6 ) then { Goto line 27 } 
[71 00 00 0F 00 00 00 00]  23  Set gprm(15) =(mov) 0 
[51 00 00 81 00 00 00 00]  24  (SetSTN) Set Audio stream = 1 
[71 00 00 0D 00 04 00 00]  25  Set gprm(13) =(mov) 4 
[30 05 00 01 00 01 00 00]  26  (JumpVTS_PTT) Jump to TTN 1, Chapter 1 
[71 00 00 0F 00 00 00 00]  27  Set gprm(15) =(mov) 0 
[51 00 00 00 C1 00 00 00]  28  (SetSTN) Set Sub-picture stream = 1, on 
[71 00 00 0D 00 05 00 00]  29  Set gprm(13) =(mov) 5 
[30 05 00 01 00 01 00 00]  30  (JumpVTS_PTT) Jump to TTN 1, Chapter 1 
[00 C1 00 0F 00 08 00 24]  31  if ( gprm(15) >= 8 ) then { Goto line 36 } 
[71 00 00 0F 00 00 00 00]  32  Set gprm(15) =(mov) 0 
[51 00 00 80 00 00 00 00]  33  (SetSTN) Set Audio stream = 0 
[71 00 00 0D 00 06 00 00]  34  Set gprm(13) =(mov) 6 
[30 05 00 01 00 01 00 00]  35  (JumpVTS_PTT) Jump to TTN 1, Chapter 1 
[71 00 00 0F 00 00 00 00]  36  Set gprm(15) =(mov) 0 
[51 00 00 00 C0 00 00 00]  37  (SetSTN) Set Sub-picture stream = 0, on 
[71 00 00 0D 00 07 00 00]  38  Set gprm(13) =(mov) 7 
[30 05 00 01 00 01 00 00]  39  (JumpVTS_PTT) Jump to TTN 1, Chapter 1 
[00 C1 00 0F 00 0D 00 38]  40  if ( gprm(15) >= 13 ) then { Goto line 56 } 
[00 C1 00 0F 00 0B 00 31]  41  if ( gprm(15) >= 11 ) then { Goto line 49 } 
[00 C1 00 0F 00 0A 00 2E]  42  if ( gprm(15) >= 10 ) then { Goto line 46 } 
[71 00 00 0F 00 00 00 00]  43  Set gprm(15) =(mov) 0 
[56 00 00 00 10 00 00 00]  44  (SetHL_BTN) Set Highlighted Button =(mov) 4096 (button 4) 
[20 04 00 00 00 00 00 06]  45  LinkPGCN PGC 6 
[71 00 00 0F 00 00 00 00]  46  Set gprm(15) =(mov) 0 
[56 00 00 00 04 00 00 00]  47  (SetHL_BTN) Set Highlighted Button =(mov) 1024 (button 1) 
[20 04 00 00 00 00 00 06]  48  LinkPGCN PGC 6 
[00 C1 00 0F 00 0C 00 35]  49  if ( gprm(15) >= 12 ) then { Goto line 53 } 
[71 00 00 0F 00 00 00 00]  50  Set gprm(15) =(mov) 0 
[56 00 00 00 04 00 00 00]  51  (SetHL_BTN) Set Highlighted Button =(mov) 1024 (button 1) 
[20 04 00 00 00 00 00 05]  52  LinkPGCN PGC 5 
[71 00 00 0F 00 00 00 00]  53  Set gprm(15) =(mov) 0 
[56 00 00 00 08 00 00 00]  54  (SetHL_BTN) Set Highlighted Button =(mov) 2048 (button 2) 
[20 04 00 00 00 00 00 05]  55  LinkPGCN PGC 5 
[00 C1 00 0F 00 0F 00 40]  56  if ( gprm(15) >= 15 ) then { Goto line 64 } 
[00 C1 00 0F 00 0E 00 3D]  57  if ( gprm(15) >= 14 ) then { Goto line 61 } 
[71 00 00 0F 00 00 00 00]  58  Set gprm(15) =(mov) 0 
[56 00 00 00 04 00 00 00]  59  (SetHL_BTN) Set Highlighted Button =(mov) 1024 (button 1) 
[20 04 00 00 00 00 00 04]  60  LinkPGCN PGC 4 
[71 00 00 0F 00 00 00 00]  61  Set gprm(15) =(mov) 0 
[56 00 00 00 08 00 00 00]  62  (SetHL_BTN) Set Highlighted Button =(mov) 2048 (button 2) 
[20 04 00 00 00 00 00 04]  63  LinkPGCN PGC 4 
[00 C1 00 0F 00 10 00 44]  64  if ( gprm(15) >= 16 ) then { Goto line 68 } 
[71 00 00 0F 00 00 00 00]  65  Set gprm(15) =(mov) 0 
[56 00 00 00 04 00 00 00]  66  (SetHL_BTN) Set Highlighted Button =(mov) 1024 (button 1) 
[20 04 00 00 00 00 00 03]  67  LinkPGCN PGC 3 
[00 C1 00 0F 00 11 00 48]  68  if ( gprm(15) >= 17 ) then { Goto line 72 } 
[71 00 00 0F 00 00 00 00]  69  Set gprm(15) =(mov) 0 
[56 00 00 00 08 00 00 00]  70  (SetHL_BTN) Set Highlighted Button =(mov) 2048 (button 2) 
[20 04 00 00 00 00 00 03]  71  LinkPGCN PGC 3 
[71 00 00 0F 00 00 00 00]  72  Set gprm(15) =(mov) 0 
[56 00 00 00 10 00 00 00]  73  (SetHL_BTN) Set Highlighted Button =(mov) 4096 (button 4) 
[20 04 00 00 00 00 00 06]  74  LinkPGCN PGC 6
Wenn wir aber genau hinschauen, dann wird klar, dass hier die Navigation über die GPRM-Variable 15 gesteuert wird. Bereits am Anfang passieren wir ein paar if-Variablen, welche würden sie denn zutreffen einen bedeutenden Teil des Blockes überspringen würden. Da unsere DVD ja zuerst das Sprachmenu aufruft, zu welchem wir auch ohne Verweilen (denn alle if-Fragen werden verworfen) bereits in Zeile 7 springen (LinkPGCN PGC 6), müssen wir nur herausfinden, welcher Wert denn für unsere eigentlichen angespassten Menus spricht.
So findet sich etwa das deutsche Menu im PGC 3 desselben VTSM-Blockes. Es würde also aufgerufen mittels "LinkPGCN PGC 3". Diesen Befehl findet man zuerst in Zeile 67. Es ist strukturell logisch, dass alle Befehle zwischen diesem Befehl und dem letzen vorherigen Menuaufruf-Befehl noch vorher ausgeführt werden. Also alles von der if-Abfrage in Zeile 64 an.
Ergo müssen wir herausfinden, wie wir zur Zeile 64 kommen, dies ist (weil der vorangehende Menuaufrufbefehl in Zeile 63 das Skript verlässt) nur über einen GOTO-Befehl möglich. Und tatsächlich finden wir nur einige Zeilen höher (Zeile 56) den Befehl "if ( gprm(15) >= 15 ) then { Goto line 64 }". Zu Deutsch: Ist die GPRM-Variable-15 grösser oder gleich 15 (dummer Zufall, dass beide Zahlen gleich sind), dann wird das deutsche Menu aufgerufen. Verfolgen wir die IF-Fragen weiter zurück, so sehen wir, dass man, wenn der Wert 15 beträgt in nur drei Hüpfern hier landet.
Wir müssen also einfach die GPRM-Variable-15 auf 15 stellen und schon kommen wir direkt zum deutschen Menu. Mit derselben Vorgehensweise erfahren wir, dass der Wert für das französische Menu 13 und derjenige fürs englische 11 beträgt.

5) Wir gehen also zurück zum letzten PGC des VMGM-Blockes, denn jenen müssen wir wie angekündigt verändern.
Dazu lassen wir einfach den ersten Befehl, welcher die wichtige Variable auf 1 stellt stehen (denn für den Fall, dass der User eine Sprache bevorzugt, die wir gar nicht anbieten wollen wir ja immer noch zum Sprachauswahlmenu) und fügen danach folgende Befehle ein:
[code0]Set gprm(14) =(mov) 25701 ("de")
if ( gprm(14) == sprm(0:Preferred menu language) ) then { Set gprm(15) =(mov) 15 }
Set gprm(14) =(mov) 0 [/code]

Dazu klicken wir einfach auf den ersten Befehl, und dann auf "Add After" und erhalten einen leeren Befehl. Jenen doppelklicken wir, gehen im sich öffnenden Dialog auf "By Type->Set->GPRM->Set GPRM (Set)" wählen im Schieber die Variable 14 aus und geben den Wert für die deutsche Sprache ein (Siehe Schritt 2).
Das wiederholen wir gleich nochmal und geben wieder den Wert 0 ein. Denn diese Variable brauchen wir hier nur kurz und wir wollen nicht irgendwelche Nebenwirkungen im späteren DVD-Ablauf haben.
Zwischen diese beiden Befehle setzen wir nun eine if-Abfrage. Die Vorgehensweise ist erstmal gleich wie für die beiden anderen Befehle. Wir erstellen einen Set-Befehl und fügen dadurch in die GPRM-Variable-15 den Wert für unser deutsches Menu (15) ein (siehe vorheriger Schritt). Dann aktivieren wir das Kästchen vor "if" wählen die Variable 14 aus, stellen auf "ist gleich" also "==" um und vergleichen sie mit der Systemvariable SPRM-0.
Dadurch wird die GPRM-Variable mit dem Wert 15 (anstatt dem Wert 1) auf die Reise geschickt, sollte der DVD-Player Deutsch als bevorzugte Sprache eingestellt haben. Dies wiederum bewirkt im weiteren Programmverlauf, dass wir anstelle des Sprachauswahlmenus direkt im deutschen Menu landen.
Wir wiederholen dies nun für französisch und englisch, bis der PGC folgendermassen aussieht:


Dann gehen wir auf "File->Save DVD" und unser Projekt ist beendet.

6) Natürlich wollen wir das erst noch überprüfen. Dazu brauchen wir einen Software-Player, bei welchem man die Lieblingssprache einstellen kann. Dies geht etwa mit dem Media Player Classic (http://sourceforge.net/projects/guliverkli/). Die entsprechende Einstellung findet man unter "View->Options->Playback->DVD/OGM".

Den abgeänderten VIDEO_TS-Ordner findet man hier:
http://rapidshare.de/files/21971808/PGC ... t.zip.html (Nur 311 KB)
Ersetzt man die IFO-Dateien im VIDEO_TS-Ordner durch jene im Backup-Ordner erhält man wieder die Original-Encore-DVD und kann dadurch auch das Tutorial selbst nachbasteln (auch ohne Encore).

Ich hoffe, dass das nicht nur mir nützlich war, wünsche viel Spass und bin wie immer für Fragen und Kommentar gerne da. (Obwohl ich meinen Forenaufenthalt nächste Woche wohl ein wenig reduzieren werde.)

SeeYa grovel



 Aktuelle Beiträge [alle Foren]
 
» Sondergagen - Wer aufmuckt, wird nicht mehr besetzt
von pillepalle - Fr 16:08
» Uwe Boll: Wie man Filme produziert ohne pleite zu gehen!
von Valentino - Fr 15:29
» Was schaust Du gerade?
von berlin123 - Fr 15:20
» Camera Update 8.6: Viele neue Funktionen für Blackmagic Kameras
von Saint.Manuel - Fr 15:08
» Micro Mirrorless Kamera - Actioncam ohne Action, aber mit Wechseloptik
von medienonkel - Fr 14:35
» Hocker für Kameramänner und Frauen?
von Mantas - Fr 14:03
» Tieraufnahmen mit dem MKE600 + H1 Essential rauschen
von Skeptiker - Fr 13:27
» Interessante Firmware-Updates für Sony Alpha 1, 7S III und 7 IV
von rush - Fr 13:12
» Neues SIGMA 50mm F1,2 DG DN | Art Objektiv wiegt 745g
von GaToR-BN - Fr 12:47
» Linsen (Vintage, Anamorphic & Co.)
von soulbrother - Fr 10:06
» >Der LED Licht Thread<
von pillepalle - Fr 8:51
» Nach 7 Jahren mit der OG BMPCC finde ich das Bild noch immer schön.
von Frank Glencairn - Fr 6:22
» Venice 2 Bildqualität zum halben Preis? Sony Burano Sensortest
von cantsin - Fr 0:52
» Nikon stellt NIKKOR Z 28-400mm f/4-8 VR Superzoom-Objektiv vor
von iasi - Do 22:45
» FCPX/Motion, DaVinci/Fusion... Tipps&Tricks
von roki100 - Do 22:27
» Panasonic AG-UX90 Phantomspeisung defekt?
von Fabi283 - Do 22:03
» Mac SSD Speed Messung?
von TomStg - Do 21:43
» Deity Sidius TC Sync Software
von pillepalle - Do 19:58
» Red Komodo 6K + Gimbal, Advanced Ring Grip und viel Zubehör
von Sevenz - Do 19:01
» 4 Gründe hartes Licht zu nutzen
von ruessel - Do 15:45
» [gelöst] 3.5mm Klinkenstecker Überwurfmutter
von Skeptiker - Do 14:42
» Panasonic S5 - Allgemeine Fragen, Tipps und Tricks, Zeig deine Bilder/Videos usw.
von Darth Schneider - Do 13:49
» -SONY FX- Erfahrungsaustausch
von rush - Do 13:40
» AOC bringt 44.5" OLED-Riesenmonitor mit 98.5% DCI-P3
von MK - Do 12:07
» Adobe führt die neue Funktion "Structure Reference" in Firefly ein
von slashCAM - Do 10:54
» Exhuma - die Südkoreaner können erfolgreiche Filme drehen
von -paleface- - Do 8:46
» Was hörst Du gerade?
von roki100 - Do 0:22
» Sony A9 III im Praxistest - ein echter Überraschungscoup auch für Filmer
von Mantas - Mi 23:27
» Video Pro X stürzt beim Multi Cam Schnitt ab
von MisterX - Mi 21:47
» Verschachtelte Timeline im richtigen Seitenformat
von Clemens Schiesko - Mi 18:43
» Untertitel in FCPX bei vorhandener Textdatei?
von R S K - Mi 18:34
» Deckenlicht mobil abschatten
von Frank Glencairn - Mi 17:31
» LUTs für Canon R6 Mark II
von TomStg - Mi 12:24
» RED versucht User nach Übernahme durch Nikon zu beruhigen
von dienstag_01 - Mi 11:52
» Entfesseltes Storytelling mit der Video-KI Sora?
von Frank Glencairn - Mi 5:54