Animiertes DVD-Menu: Unterschied zwischen den Versionen
Puppe (Diskussion | Beiträge) K (geändert) |
Yehudi (Diskussion | Beiträge) K (Wiederhergestellt zur letzten Änderung von Robi) |
||
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 14: | Zeile 16: | ||
# 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 | + | TIME=25 #Zeit in Sekunden fuer Menu (12-120) |
− | TEXT1="Linux-Club" | + | TEXT1="Linux-Club" #Titel der DVD nach 3 Sekunden im ersten Drittel |
− | TEXT2="DVD-Authoring" | + | TEXT2="DVD-Authoring" #Titel der DVD in Mitte |
− | TEXT3="DEMO DVD-Menu" | + | 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 72: | Zeile 75: | ||
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 90: | Zeile 93: | ||
-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 | + | rm frame?00$i.png frame?00$i.ppm & |
echo -en '\r' | echo -en '\r' | ||
else break | else break | ||
Zeile 99: | Zeile 102: | ||
#--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 | + | -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 120: | Zeile 123: | ||
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*}] | + | 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 149: | Zeile 152: | ||
<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" | |
− | + | select="select.png" | |
− | + | autooutline="infer" | |
− | + | autoorder="rows"/> | |
</stream> | </stream> | ||
</subpictures> | </subpictures> | ||
Zeile 161: | Zeile 164: | ||
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 166: | Zeile 170: | ||
− | + | --[[Benutzer:Robi|Robi]] 01:53, 26. Sep 2006 (CEST) | |
[[Category:Scripte]] | [[Category:Scripte]] | ||
[[Category:Multimedia]] | [[Category:Multimedia]] |
Version vom 27. November 2006, 18:27 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
#!/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 # Autor: robi@www.Linux-Club.de 26.09.2006 #-------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" #------- Autor: robi@www.linux-club.de---------------#
--Robi 01:53, 26. Sep 2006 (CEST)