Animiertes DVD-Menu: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
K (Konfigurationsmöglichkeiten erweitert)
K (geändert)
Zeile 9: Zeile 9:
  
 
=== videomenu.sh ===
 
=== videomenu.sh ===
<!-- getestet auf mehreren Rechnern unter SuSE 9.1 und SuSE 10.1 - Robi -->
 
 
 
<pre>
 
<pre>
 
#!/bin/bash
 
#!/bin/bash
Zeile 16: Zeile 14:
 
# Script zum Erzeugen eines DVD-Menus aus mehreren Videosequenzen
 
# Script zum Erzeugen eines DVD-Menus aus mehreren Videosequenzen
 
# Beschreibung und Dokumentation: http://www.linux-club.de/faq/Mastering_per_Script
 
# Beschreibung und Dokumentation: http://www.linux-club.de/faq/Mastering_per_Script
# Autor: robi@www.Linux-Club.de  26.09.2006
 
  
 
#-------manuelle Konfiguration des Scriptes ----------#
 
#-------manuelle Konfiguration des Scriptes ----------#
TIME=25                       #Zeit in Sekunden fuer Menu (12-120)
+
TIME=25                       #Zeit in Sekunden fuer Menu (12-120)
TEXT1="Linux-Club"           #Titel der DVD nach 3 Sekunden im ersten Drittel
+
TEXT1="Linux-Club"             #Titel der DVD nach 3 Sekunden im ersten Drittel
TEXT2="DVD-Authoring"         #Titel der DVD in Mitte  
+
TEXT2="DVD-Authoring"         #Titel der DVD in Mitte  
TEXT3="DEMO DVD-Menu"         #Titel der DVD in letzem Drittel bis 3 Sekunden vor Ende
+
TEXT3="DEMO DVD-Menu"         #Titel der DVD in letzem Drittel bis 3 Sekunden vor Ende
 
LOGO="/home/user/bilder/Musterlogo.png"              #Logo 64x64
 
LOGO="/home/user/bilder/Musterlogo.png"              #Logo 64x64
 
G="120x90"                                            #Framegroesse 200x152;160x120;120x90
 
G="120x90"                                            #Framegroesse 200x152;160x120;120x90
Zeile 75: Zeile 72:
 
   Y0[$i]=$[${A[$i]#*x}-${D#*x}]
 
   Y0[$i]=$[${A[$i]#*x}-${D#*x}]
 
done   
 
done   
for i in {0,1,2}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}
+
for i in {0,1,2}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}  
 
   do
 
   do
 
   if [ -f backr00$i.ppm ]; then
 
   if [ -f backr00$i.ppm ]; then
Zeile 93: Zeile 90:
 
     -draw "image over ${X0[6]},${Y0[6]} 0,0 frame600$i.png" \
 
     -draw "image over ${X0[6]},${Y0[6]} 0,0 frame600$i.png" \
 
     backr00$i.ppm 2>/dev/null
 
     backr00$i.ppm 2>/dev/null
     rm frame?00$i.png frame?00$i.ppm &
+
     rm frame?00$i.png frame?00$i.ppm &
 
   echo -en '\r'
 
   echo -en '\r'
 
   else break
 
   else break
Zeile 102: Zeile 99:
 
#--Bilder Schrift und Sound  zu Video zusammensetzen -------#
 
#--Bilder Schrift und Sound  zu Video zusammensetzen -------#
 
transcode -H 0 -i bilder-list -g 720x576 --use_rgb -x imlist,null -o menu0.avi -y raw,null \
 
transcode -H 0 -i bilder-list -g 720x576 --use_rgb -x imlist,null -o menu0.avi -y raw,null \
   -F RGB --import_asr 2 --export_asr 2   
+
   -F RGB --import_asr 2 --export_asr 2   
 
rm backr*.ppm &
 
rm backr*.ppm &
 
transcode -i menu0.avi --use_rgb -o menu1.avi -y raw,null  -F RGB \
 
transcode -i menu0.avi --use_rgb -o menu1.avi -y raw,null  -F RGB \
Zeile 123: Zeile 120:
 
do
 
do
 
  X1[$i]=$[${A[$i]%x*}-${M[1]%x*}] ; Y1[$i]=$[${A[$i]#*x}-${M[1]#*x}]
 
  X1[$i]=$[${A[$i]%x*}-${M[1]%x*}] ; Y1[$i]=$[${A[$i]#*x}-${M[1]#*x}]
  X2[$i]=$[${A[$i]%x*}+${M[1]%x*}+${G%x*}] ; Y2[$i]=$[${A[$i]#*x}+${M[1]#*x}+${G#*x}]
+
  X2[$i]=$[${A[$i]%x*}+${M[1]%x*}+${G%x*}] ; Y2[$i]=$[${A[$i]#*x}+${M[1]#*x}+${G#*x}]
 
  X3[$i]=$[${A[$i]%x*}-${M[2]%x*}] ; Y3[$i]=$[${A[$i]#*x}-${M[2]#*x}]
 
  X3[$i]=$[${A[$i]%x*}-${M[2]%x*}] ; Y3[$i]=$[${A[$i]#*x}-${M[2]#*x}]
 
  X4[$i]=$[${A[$i]%x*}+${M[2]%x*}+${G%x*}] ; Y4[$i]=$[${A[$i]#*x}+${M[2]#*x}+${G#*x}]
 
  X4[$i]=$[${A[$i]%x*}+${M[2]%x*}+${G%x*}] ; Y4[$i]=$[${A[$i]#*x}+${M[2]#*x}+${G#*x}]
Zeile 152: Zeile 149:
 
     <stream>  
 
     <stream>  
 
       <spu start="00:00:00.0" end="00:00:00.0"  
 
       <spu start="00:00:00.0" end="00:00:00.0"  
            highlight="highlight.png"  
+
          highlight="highlight.png"  
            select="select.png"  
+
          select="select.png"  
            autooutline="infer"  
+
          autooutline="infer"  
            autoorder="rows"/>  
+
          autoorder="rows"/>  
 
     </stream>  
 
     </stream>  
 
</subpictures>
 
</subpictures>
Zeile 164: Zeile 161:
 
rm spumux.xml menu3.m2v menu.mpg geotest.png bilder-list highlight.png select.png
 
rm spumux.xml menu3.m2v menu.mpg geotest.png bilder-list highlight.png select.png
 
echo -e "\nDas DVD-Menu ist jetzt fertig\n\n\tmenu_finale.vob\n\nScript ENDE"
 
echo -e "\nDas DVD-Menu ist jetzt fertig\n\n\tmenu_finale.vob\n\nScript ENDE"
#------- Autor: robi@www.linux-club.de---------------#
 
 
</pre>
 
</pre>
 
----
 
----
Zeile 170: Zeile 166:
  
  
--[[Benutzer:Robi|Robi]] 01:53, 26. Sep 2006 (CEST)
+
 
  
  
 
[[Category:Scripte]]
 
[[Category:Scripte]]
 
[[Category:Multimedia]]
 
[[Category:Multimedia]]

Version vom 27. November 2006, 08:09 Uhr

Script zum Erzeugen eines animierten DVD-Video-Menu

Dieses Script erzeugt aus Videodateien ein animiertes Video-Menü, welches Mittels dvdauthor zum Erstellen von Video-DVD benutzt werden kann. Es kommen dabei verschiedene Techniken zum Einsatz. Zum einen werden Filterfunktionen des transcode Befehles benutzt, und zum anderen werden die Videosequenzen komplett in Einzelbilder zerlegt und mittels scriptgesteuerter Grafikbearbeitung bearbeitet. Mit solchen Techniken lassen sich auch selber kleine Videoeffekte erzeugen, für die es noch keine greifbaren Programme oder Tools gibt.

Bei der manuellen Erstellung solcher Menüs gibt es immer wieder Probleme mit der Erstellung der Masken für spumux. Das Script erzeugt diese speziellen Bilddateien gleich mit und führt den spumux-Befehl auch gleich aus. Das Ergebniss ist eine Datei Namens menu_finale.vob welche innerhalb von dvdauthor als Menü bei der Video-DVD Erstellung verwendet werden kann.

Beschreibung und Erklärungen : Mastering per Script


videomenu.sh

#!/bin/bash
# Scriptname: videomenu.sh
# Script zum Erzeugen eines DVD-Menus aus mehreren Videosequenzen
# Beschreibung und Dokumentation: http://www.linux-club.de/faq/Mastering_per_Script

#-------manuelle Konfiguration des Scriptes ----------#
TIME=25                        #Zeit in Sekunden fuer Menu (12-120)
TEXT1="Linux-Club"             #Titel der DVD nach 3 Sekunden im ersten Drittel
TEXT2="DVD-Authoring"          #Titel der DVD in Mitte 
TEXT3="DEMO DVD-Menu"          #Titel der DVD in letzem Drittel bis 3 Sekunden vor Ende
LOGO="/home/user/bilder/Musterlogo.png"               #Logo 64x64
G="120x90"                                            #Framegroesse 200x152;160x120;120x90
ORGINAL="/media/cdrecorder/video_ts/vts_05_1.vob"     #Hintergrundvideo
FRAME[1]="/media/cdrecorder/video_ts/vts_02_1.vob"    #Framevideo 1
FRAME[2]="/media/cdrecorder/video_ts/vts_14_1.vob"    #Framevideo 2
FRAME[3]="/media/cdrecorder/video_ts/vts_03_1.vob"    #Framevideo 3
FRAME[4]="/media/cdrecorder/video_ts/vts_07_1.vob"    #Framevideo 4
FRAME[5]="/media/cdrecorder/video_ts/vts_09_1.vob"    #Framevideo 5
FRAME[6]="/media/cdrecorder/video_ts/vts_08_1.vob"    #Framevideo 6
SOUND="/home/user/sound/soundfile.ac3"                #Soundfile AC-3
FILMNAME[1]="Film Nr. 1"       #Frame-Name 1
FILMNAME[2]="Film Nr. 2"       #Frame-Name 2
FILMNAME[3]="Film Nr. 3"       #Frame-Name 3
FILMNAME[4]="Film Nr. 4"       #Frame-Name 4
FILMNAME[5]="Film Nr. 5"       #Frame-Name 5
FILMNAME[6]="Film Nr. 6"       #Frame-Name 6
ZAHL=6          #Anzahl der Frames  im Videomenu
A[1]="81x80"    #Pos Frame 1 bei 120x90
A[2]="227x80"   #Pos Frame 2 bei 120x90
A[3]="373x80"   #Pos Frame 3 bei 120x90
A[4]="519x80"   #Pos Frame 4 bei 120x90
A[5]="81x380"   #Pos Frame 5 bei 120x90
A[6]="519x380"  #Pos Frame 6 bei 120x90
FONT="/usr/X11R6/lib/X11/fonts/truetype/SUSESerif-Bold.ttf"
#----- Ende fuer manuelle Konfigurationseingaben------#

#----------- Scriptinterne Konfiguration -------------#
BORDER=" -frame 5 -geometry +0+0 "
COLOR=" -mattecolor grey "
M[1]="3x3"    #Maske1
M[2]="0x0"    #Maske2
ANZAHL=$[$TIME*25] 
RANGE1=75-$[$ANZAHL/3]
RANGE2=$[$ANZAHL/3]-$[$ANZAHL-$ANZAHL/3]
RANGE3=$[$ANZAHL-$ANZAHL/3]-$[$ANZAHL-75]

#-------- Videos als Bilder einlesen -----------------#
transcode -i $ORGINAL -o backr -Z 720x576  -y ppm -c 0-$ANZAHL
for i in `seq 1 $ZAHL`
do
transcode -i ${FRAME[i]} -o frame$i -Z $G -y ppm -c 0-$ANZAHL
done

#------- Videobilder bearbeiten ----------------------#
montage  $BORDER -label "Test" frame1000000.ppm geotest.png
GEO=`identify -verbose geotest.png | grep Geometry: |cut -d: -f2`
D=$[(${GEO%x*}-${G%x*})/2]x$[(${GEO#*x}-22-${G#*x})/2]
for i in `seq 1 $ZAHL`
  do
  X0[$i]=$[${A[$i]%x*}-${D%x*}]
  Y0[$i]=$[${A[$i]#*x}-${D#*x}]
done  
for i in {0,1,2}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} 
  do
  if [ -f backr00$i.ppm ]; then
   echo -n "frame $i"
   for j in `seq 1 $ZAHL`
    do   
     montage -quality 100 $BORDER $COLOR -label "${FILMNAME[$j]}" -font $FONT \
      frame${j}00${i}.ppm frame${j}00${i}.png
    done
 
     mogrify -quality 100 \
    -draw "image over ${X0[1]},${Y0[1]} 0,0 frame100$i.png" \
    -draw "image over ${X0[2]},${Y0[2]} 0,0 frame200$i.png" \
    -draw "image over ${X0[3]},${Y0[3]} 0,0 frame300$i.png" \
    -draw "image over ${X0[4]},${Y0[4]} 0,0 frame400$i.png" \
    -draw "image over ${X0[5]},${Y0[5]} 0,0 frame500$i.png" \
    -draw "image over ${X0[6]},${Y0[6]} 0,0 frame600$i.png" \
     backr00$i.ppm 2>/dev/null
    rm frame?00$i.png  frame?00$i.ppm &
   echo -en '\r'
  else break
  fi 
done
ls backr00*.ppm | sort > bilder-list

#--Bilder Schrift und Sound  zu Video zusammensetzen -------#
transcode -H 0 -i bilder-list -g 720x576 --use_rgb -x imlist,null -o menu0.avi -y raw,null \
  -F RGB --import_asr 2  --export_asr 2  
rm backr*.ppm &
transcode -i menu0.avi --use_rgb -o menu1.avi -y raw,null  -F RGB \
  -J text=string="$TEXT1":font="$FONT":posdef=5:points=44:fade=2:range=$RANGE1:color=00FF00
rm menu0.avi &
transcode -i menu1.avi --use_rgb -o menu2.avi -y raw,null\
  -J text=string="$TEXT2":font="$FONT":posdef=5:points=44:fade=2:range=$RANGE2:color=FFFFFF \
  -J logo=file=$LOGO:pos=592x480:range=0-100
rm  menu1.avi &
transcode -i menu2.avi --use_rgb -o menu3.avi -y raw,null\
  -J text=string="$TEXT3":font="$FONT":posdef=5:points=44:fade=2:range=$RANGE3:color=FF0000 
rm  menu2.avi &
transcode -z -k --use_rgb --pre_clip 0,0,0,0 -i menu3.avi -o menu3 -y mpeg2enc,null \
 -F 8 --export_prof dvd-pal  -w 9800 --encode_fields t  
rm menu3.avi &
mplex -f 8 -l $TIME -o menu.mpg menu3.m2v "$SOUND"

#-------- Masken fuer Menu erzeugen -----------------#
for i in `seq 1 $ZAHL`
do
 X1[$i]=$[${A[$i]%x*}-${M[1]%x*}] ; Y1[$i]=$[${A[$i]#*x}-${M[1]#*x}]
 X2[$i]=$[${A[$i]%x*}+${M[1]%x*}+${G%x*}]  ; Y2[$i]=$[${A[$i]#*x}+${M[1]#*x}+${G#*x}]
 X3[$i]=$[${A[$i]%x*}-${M[2]%x*}] ; Y3[$i]=$[${A[$i]#*x}-${M[2]#*x}]
 X4[$i]=$[${A[$i]%x*}+${M[2]%x*}+${G%x*}] ; Y4[$i]=$[${A[$i]#*x}+${M[2]#*x}+${G#*x}]
done
for FILE in highlight.png select.png
 do
 if [ $FILE = "select.png" ];then BORCOL="red" ;else BORCOL="yellow" ;fi
 convert -size 720x576 xc:white -fill $BORCOL \
 -draw "rectangle ${X1[1]},${Y1[1]} ${X2[1]},${Y2[1]}" \
 -draw "rectangle ${X1[2]},${Y1[2]} ${X2[2]},${Y2[2]}" \
 -draw "rectangle ${X1[3]},${Y1[3]} ${X2[3]},${Y2[3]}" \
 -draw "rectangle ${X1[4]},${Y1[4]} ${X2[4]},${Y2[4]}" \
 -draw "rectangle ${X1[5]},${Y1[5]} ${X2[5]},${Y2[5]}" \
 -draw "rectangle ${X1[6]},${Y1[6]} ${X2[6]},${Y2[6]}" \
 -fill white \
 -draw "rectangle ${X3[1]},${Y3[1]} ${X4[1]},${Y4[1]}" \
 -draw "rectangle ${X3[2]},${Y3[2]} ${X4[2]},${Y4[2]}" \
 -draw "rectangle ${X3[3]},${Y3[3]} ${X4[3]},${Y4[3]}" \
 -draw "rectangle ${X3[4]},${Y3[4]} ${X4[4]},${Y4[4]}" \
 -draw "rectangle ${X3[5]},${Y3[5]} ${X4[5]},${Y4[5]}" \
 -draw "rectangle ${X3[6]},${Y3[6]} ${X4[6]},${Y4[6]}" \
 -transparent white $FILE 2>/dev/null
done

#---------- spumux.xml erzeugen ---------------------#
cat > spumux.xml <<EOF
<subpictures> 
    <stream> 
       <spu start="00:00:00.0" end="00:00:00.0" 
           highlight="highlight.png" 
           select="select.png" 
           autooutline="infer" 
           autoorder="rows"/> 
    </stream> 
</subpictures>
EOF

#------------- Menuvideo maskieren ------------------#
spumux spumux.xml < menu.mpg > menu_finale.vob
rm spumux.xml menu3.m2v menu.mpg geotest.png bilder-list highlight.png select.png
echo -e "\nDas DVD-Menu ist jetzt fertig\n\n\tmenu_finale.vob\n\nScript ENDE"