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]
 
» AJA: ColorBox 2.1 ACES-Workflow und DRM2 für das DIT-Cart erklärt
von slashCAM - Do 15:48
» Insta360 X4 360°-Action-Kamera filmt in 8K
von -paleface- - Do 14:19
» Ambisonics in Resolve
von Axel - Do 12:09
» MP4 Video verlustfrei exportieren
von Frank Glencairn - Do 10:54
» NAB 2024 Neuigkeiten
von Frank Glencairn - Do 10:23
» Blackmagic PYXIS 6K: Die Vollformat „Box“-Kamera mit Viewfinder, 2x SDI, Sideplates (!) uvm.
von cantsin - Do 8:39
» Messevideo: Atomos NINJA PHONE erklärt
von Frank Glencairn - Do 6:06
» Canon öffnet RF-Mount - Erste Objektive von Sigma (18-50 mm f/2.8) und Tamron (11-20 mm f/2,8)
von cantsin - Mi 20:26
» Tragischer Unfall am Set trotz Filmwaffe: Kamerafrau stirbt nach Schuß von Alec Baldwin
von iasi - Mi 19:53
» SmallRig @ NAB 2024: Potato Jet Stativ, Brandon Li Cage, VB212 Akku
von iasi - Mi 19:46
» Retention Video Editing ist tot
von DeeZiD - Mi 16:56
» Resolve-Mac, 5000€
von Franz86 - Mi 14:34
» Audition CS6 > Arbeitsbereich aus Versehen gelöscht
von Herbie - Mi 12:10
» DJI Power 500 und 1000: Mobile Powerstations mit bis zu 1.024 Wh
von slashCAM - Mi 9:27
» Atomos Neon 24 - 4K HDR-Grading Display-Recorder
von teichomad - Mi 9:14
» Atomos Ninja als HDMI-Recorder
von Saint.Manuel - Mi 8:41
» DaVinci Resolve 19: Die neuen Funktionen ausführlich erklärt
von freezer - Mi 8:20
» Meine erste Kritik in Filmthread :-)
von Frank Glencairn - Mi 8:12
» Kostenloser Fairlight Workshop mit Mary Plummer
von Frank Glencairn - Mi 6:31
» Musikvideo Floridas Klaus "Che Guevara"
von MK - Di 18:37
» Realistischer und mehr Details - Adobe Firefly Image 3 Model für Web und Photoshop
von slashCAM - Di 14:48
» Adobe Firefly KI jetzt auch mobil in neuer Express App verfügbar
von slashCAM - Di 14:15
» Z Cam E2G, E2C, E2-6F, E2-S6, E2-F8
von Clemens Schiesko - Di 13:45
» Canon öffnet RF-Mount - aber nur für APS-C
von stip - Di 10:10
» Cannes 2024
von 7River - Di 9:28
» Woody Allen: Coup de Chance (ab Herbst 2023, Venedig)
von Skeptiker - Di 8:19
» Panasonic HC X2000 und Rode
von rush - Mo 21:02
» SmallRig: Creators Toolkit
von Darth Schneider - Mo 15:13
» Bullet Time Setup aus 75 DSLRs :)
von LarsS - Mo 12:49
» Dehancer Pro - Filmsimulation auf höchstem Niveau
von MK - Mo 12:12
» Kostenlose Motion Cam App ermöglicht erstmals CinemaDNG RAW-Videoaufnahme auf Smartphones
von cantsin - Mo 9:39
» Air2S Problem Speicherkarte
von Jott - Mo 9:34
» CyberLink PowerDirector: Noch mehr integrierte KI-Effekte für Video
von medienonkel - So 18:40
» Anfänger im Schnitt Stunden- bzw. Tageshonorar Beteiligung am Gewinn
von Bergspetzl - So 18:17
» AOCs neue Preisbrecher-Monitore für Bildverarbeitung
von cantsin - So 17:51