# # Macht das Video-Encoding für Chaosseminar-Videos vom CCC Erfa-Kreis Ulm. # # Geschrieben von Nico nach Hinweisen von Michael. Danke! :-) # # Version: 0.1.4, 2008-01-29 # # # Nur getestet mit GNU Make 3.81. # # # # # VORAUSSETZUNGEN # ═════════════════ # # # Im Folgenden gilt: # Bytes haben 8 Bits, also ist ein Byte genau ein Oktett lang. # Ein Word sei definiert als zwei Bytes. # # # Benutzer # ────────── # # Solltest du eine der folgenden Fragen mit „Weiß ich nicht.“ (oder falsch ;-) ) # beantworten, bist du leider nicht geeignet, um dieses System zu benutzen. In # dem Fall, geh bitte zur Wikipedia (du möchtest mit # anfangen), mach dort deine # Hausaufgaben und komm anschließend wieder. Das erspart uns allen viel Stress. # Danke. # # Kurzer Test für Benutzer dieses Skripts (natürlich stehen die Antworten # *nicht* hier drin, das wäre ja langweilig): # # 1. Ist DV komprimiert? # 2. Wieso ist FAT32 ungeeignet, um Videos darauf zu schneiden oder zu # transkodieren? # 3. Welches Format, das dieses Makefile verarbeitet, hat eine Nutzdatenrate # von 1.536 kbit/s? Worin besteht der Unterschied zwischen dieser Zahl und # 1,46484375 MiB/s? (Nein, „MiB/s“ sind keine Men in Black pro Sekunde.) # 4. Wie konvertiert man (unter Benutzung von Open-Source-Software, versteht # sich) ein MPG-Video mit QuickTime-3.2-Overlay (Interactive Scan, # 48.000 Scanlines pro Sekunde, MJPEG-Bildrekompressionsalgorithmus, Data # Flow Rate 4,71 Megabyte pro Sekunde, einfacher statt doppelter # Containertranscoder für „.mpg“), MP3-Audio mit 328,7 Kilobyte pro # Sekunde und Untertiteln im DVD-Format (AAC-Untertitel, Kompression mit # zlib, aber ohne Dolby) in ein normales AVI-Video? # 5. Wie konvertiert man (unter Benutzung von Open-Source-Software, versteht # sich) üblicherweise einen YUV-Videostrom (ohne Container) nach H.264 # (mit MP4-Container)? # 6. Was ist der Unterschied zwischen Videoströmen im AVI-Format und # Videocontainern im Theora-Format, wenn man mal die Bitrate der # MP4-Kompression außer Acht lässt (denn die ist ja immer verschieden)? # 7. Wie findest du heraus, wie der Header von WAV-Dateien aufgebaut ist? # 8. Muss man 16-Bit-Audio von 48 kHz nach 44,1 kHz transkodieren, bevor man # es in ein DV-Video kopiert? Wieso (nicht)? Wie lautet der Befehl für # diese Transkodierung, wenn man das Paket „sox“ verwendet? # 9. Wieso sollte man nach H.264 transkodiertes Videomaterial nicht mehr # schneiden? # 10. Du möchtest Videomaterial nach Theora transkodieren. Wird die Größe des # sich ergebenden Theora-Videostroms kleiner, wenn du vor dem Kodieren # einen temporalen Denoiser über das Videomaterial laufen lässt? # 11. Wie groß ist der Speicherplatzbedarf für 24,855 Stunden (also etwas mehr # als einen Tag) unkomprimierte Stereo-Audioaufnahme mit Word-Samples und # einer Samplerate von 48 k bei Speicherung in einem WAV-Audiocontainer? # Worin besteht das Problem, falls man mehr aufnehmen und in einer # WAV-Datei speichern möchte? # # Na, hat’s dir Spaß gemacht? Uns auch. :-) # # Falls du denkst, dass du geeignet seist, dir langweilig ist, du nicht schon im # Chaosseminar-Video-TEAM des CCC Erfa-Kreises Ulm bist und du in Ulm, DE oder # Umgebung (eine schnelle Internetanbindung zählt als Umgebung) wohnst: # . # # # Eingabe-Video # ─────────────── # # Dieses Makefile erfordert natürlich ein fertig geschnittenes Video im # DV-Format (raw DV!). Du möchtest *keine* seltsamen Dinge mit AVI- oder # QuickTime-Containern ausprobieren. # # Als Format möchtest du: # Raw DV, PAL, 720x576, 50i, 4:2:0, 48000/16LE/2. # Ja, diese Angaben sind teilweise redundant. # # Solltest du versehentlich 12-Bit-Audio aufgenommen haben: oje, viel Spaß … # # # Dateisystem # ───────────── # # Die Dateisysteme FAT12, FAT16 bzw. FAT32 sind für diese Schnitt-Sachen *NICHT* # geeignet (es sei denn, du heißt Michael oder Nico und *weißt genau*, was du # tust! Ja, zugegebenermaßen, es gibt *Hacks*, mit denen das dennoch geht. Aber # die *willst* du *gar nicht* ausprobieren!). # # Stand 2008-01-29 wird XFS als Dateisystem empfohlen. # # # Speicherplatzbedarf # ───────────────────── # # 1 Frame DV hat exakt 144.000 Bytes. Also haben 25 Frames (entsprechend # 1 Sekunde) 3.600.000 Bytes = 3,6 MB. 2 Stunden, 16 Minuten und 32 Sekunden # (typische Länge eines Chaosseminar-Videos) haben also *exakt* 28.125 MiB, also # rund 27,466 GiB. # # I sei die Größe der Eingabe-Video-Datei im oben beschriebenen Raw-DV-Format in # Bytes. # # Berechne folgende Werte: # A = I / 144000 / 25 * 48000 * 2 * 2 / 1024 / 1024 = I / 19660800 # A ist die Größe des Audio-Anteils in MiB. # V = I / 1024 / 1024 - A # V ist die Größe des Video-Anteils in MiB. # # # An freiem Speicherplatz (wenn Eingabe-Video mit Größe I schon gespeichert ist) # werden benötigt: # AUDIO: A + 44 Bytes für WAV mit Audio # # Erzeugte Dateien mit _VIDEO oder _AUDIO im Namen sind temporäre Dateien, die # später wieder entfernt werden können. # Erzeugte Dateien mit _video oder _audio im Namen sind die endgültigen Dateien, # die man haben will. :-) # # # Interner Video-Archiv-Schlüssel (i. d. R. vom Video-Team vergeben). # Man übergibt den normalerweise auf der Kommandozeile. # KEY= # # Eingabedatei, aus der das rohe, fertig geschnittene Video gelesen werden soll. # Darf ruhig viele, viele GiB haben (üblich sind so etwa 30 GiB pro # Chaosseminar-Video), das geht schon … # INPUTFILE=$(KEY).dv # # Welches normalisierte Audio verwendet werden soll: # * „QMW“ = Normalisierung basierend auf quadratischem Mittelwert, # * „PEAK“ = Normalisierung basierend auf lautestem Peak # * „NONE“ = keine Normalisierung, Original-Audio verwenden. #AUDIO_NORMALIZE=NONE AUDIO_NORMALIZE=QMW # # Wer diese Option ändert und nicht Nico ist und das Make-Handbuch nicht gelesen # hat, ist doomed. # PARALLEL=-j 1 -l 0 #PARALLEL=-j 3 -l 7.5 # Viel Spaß, Nico! # # Man stelle das für Single-Prozessor-Kisten mal lieber nicht höher als 2. Am # besten auf 1. # X264_THREADS=1 #X264_THREADS=3 # # Falls es mal jemandem zu langsam geht UND nur getestet wird … cat. # WARNUNG: Wirkt sich natürlich schlimmst auf die Testergebnisse aus!!! # DENOISER=yuvdenoise -g 2,3,3 GST_LAUNCH=gst-launch-0.10 SAR="4:3" IPOD_RES="328x240" DEFAULT_RES="656x480" IPOD_CROP=-cropleft 4 -cropright 4 CROP=-cropleft 8 -cropright 8 AUDIN="raw" # # Für Leute, die ‚make all‘ oder ‚make‘ eingeben # all: @false # # Dann wollen wir mal … # World: @test "$(KEY)z" != z $(MAKE) $(PARALLEL) $@-recursive OUTPUTFILES=$(KEY)_audio.ogg $(KEY)_audio.mp3 $(KEY)_video.ogg $(KEY)_video.mp4 $(KEY)_video.m4v # $(KEY)_video.3gp World-recursive: $(OUTPUTFILES) hd: $(MAKE) $(PARALLEL) INPUTFILE=$(KEY).ts SAR="16:9" AUDIN="mp2" IPOD_RES="320x176" DEFAULT_RES="640x480" CROP="" IPOD_CROP="" OUTPUTFILES="$(OUTPUTFILES) $(KEY)_video_high.mp4" World nico: $(MAKE) X264_THREADS=3 PARALLEL='-j 3 -l 8' World .PHONY: nico I_AM_SURE= # # Audio extrahieren (und gleich mal nach Mono mit 44.1 kHz verwandeln) # Ausgabe ist pcm_s16le/44100/1 in WAV-Container # # XXX: Dieser Code gilt für Little-Endian-Maschinen! Für Big-Endian-Kisten muss # entweder der ffmpeg-Aufruf angepasst werden oder sox braucht noch ‚-x‘ als # zusätzlichen Parameter! # AUDIOINPUT=$(KEY)_AUDIO_INPUT.wav $(AUDIOINPUT): $(INPUTFILE) ffmpeg -i "$<" -f s16le -acodec copy -vn - | \ sox -t $(AUDIN) -s -w -r 48000 -c 2 - \ -t wav -s -w -r 44100 -c 1 "$@" # sox -t raw -s -w -r 48000 -c 2 - \ # sox -t mp2 -s -w -r 48000 -c 2 - \ # # Audio normalizen (Lautstärke adjusten, falls außerhalb eines gewissen # Bereichs); # Anpassung erfolgt basierend auf quadratischen Mittelwert # $(KEY)_AUDIO_NORMALIZED-QMW.wav: $(AUDIOINPUT) cp -v "$<" "$@" # Default-Settings von normalize-0.7.7 werden hier explizit wiederholt, falls # sie sich in einer zukünftigen Version mal ändern sollten. Die Videos sollen # natürlich immer die gleichen Einstellungen haben. normalize --amplitude=-12dBFS --limiter=0.5 --adjust-threshold=0.125 \ -vv --fractions \ "$@" # In normalize-0.7.7 gibt es (im Quellcode, src/common.h) VERBOSE_QUIET (0), # VERBOSE_PROGRESS (1), VERBOSE_INFO (2) und VERBOSE_DEBUG (3). src/normalize.c # setzt den Verbositäts-Level auf VERBOSE_PROGRESS. Zwei ‘-v’ ergeben also # VERBOSE_DEBUG, mehr bringt nix. # # Audio normalizen (Lautstärke adjusten, falls außerhalb eines gewissen # Bereichs); # Anpassung erfolgt basierend auf lautestem Peak # $(KEY)_AUDIO_NORMALIZED-PEAK.wav: $(AUDIOINPUT) cp -v "$<" "$@" # Default-Settings von normalize-0.7.7 werden hier explizit wiederholt, falls # sie sich in einer zukünftigen Version mal ändern sollten. Die Videos sollen # natürlich immer die gleichen Einstellungen haben. normalize --amplitude=-12dBFS --limiter=0.5 --adjust-threshold=0.125 \ -vv --fractions \ --peak \ "$@" # In normalize-0.7.7 gibt es (im Quellcode, src/common.h) VERBOSE_QUIET (0), # VERBOSE_PROGRESS (1), VERBOSE_INFO (2) und VERBOSE_DEBUG (3). src/normalize.c # setzt den Verbositäts-Level auf VERBOSE_PROGRESS. Zwei ‘-v’ ergeben also # VERBOSE_DEBUG, mehr bringt nix. # # Audio nicht normalizen (sondern nur Link zur Original-Version bereitstellen) # $(KEY)_AUDIO_NORMALIZED-NONE.wav: $(AUDIOINPUT) ln -sf "$<" "$@" ################################################################################ ## ## Audio nach MPEG II, Layer 3 encoden ## XXX: Hardcore-Variante, die alle möglichen Optimierungen nutzt. Vermutlich ## nicht für tragbare Player geeignet!!! TODO:TESTME!!! ## #AUDIO_$(HARDCORE).mp3: # lame -m m -q 0 --freeformat --clipdetect --preset 80 ## TODO:CHECKME: Prüfen, ob ‚-t‘ für lame ganz toll ist oder nicht, ## vorausgesetzt, man verwendet keine VBR. # # Bei Verwendung von VBR: --vbr-new -V 2 verwenden, schätze ich … TODO:testen! ################################################################################ # # Video extrahieren und nachbearbeiten (mittels mjpegtools-Pipeline) # # (Hinweis: Nachbearbeitetes Video wird im Y4M-Format gespeichert und von dort # aus weiter verarbeitet.) # #Y4MFILE=$(KEY)_VIDEO.y4m #$(Y4MFILE): $(INPUTFILE) # ffmpeg -i "$<" -deinterlace -s 656x480 -cropleft 8 -cropright 8 -f yuv4mpegpipe - | y4munsharp | yuvdenoise -G 2,3,3 > "$@" # ffmpeg -i "$<" -deinterlace -s 656x480 -cropleft 8 -cropright 8 -f yuv4mpegpipe - | $(DENOISER) > "$@" # Für H.264-Encoding für iPod verwendet: #SMALL_Y4MFILE=$(KEY)_VIDEO_SMALL.y4m #$(SMALL_Y4MFILE): $(Y4MFILE) #$(SMALL_Y4MFILE): $(INPUTFILE) # XXX: Hier wird das bestehende Video einfach nochmal runterskaliert, und zwar # auf genau ein Viertel der Größe (also Breite und Höhe je durch zwei geteilt). # Evtl. bekommt man bessere Ergebnisse, wenn man ffmpeg nochmal laufen lässt und # das Video gleich von ffmpeg verkleinern lässt und anschließend den Denoiser # drüber laufen lässt … aber das glaube ich eigentlich weniger. TODO: testen. # y4mscaler -O size=320x240 < $< > $@ # Resultat sieht für mich genauso gut aus, Skalierung ist aber schneller: # y4mscaler -O size=320x240 -S option=box < $< > $@ # Zumindest in x264-svn-20070924 nicht mehr nötig. :-) ## ## Header umbasteln für H.264-Encoder. ## Ineffizienter Mist, vermutlich optimierbar … ## #YUVFILE=$(KEY)_VIDEO.yuv #$(YUVFILE): $(Y4MFILE) # y4mtoyuv < $< > $@ # # Nach Theora encoden # (dieses Target behandelt in der Tat *nur* Video!) # #$(KEY)_VIDEO.ogg: $(Y4MFILE) $(KEY)_VIDEO.ogg: $(INPUTFILE) # ffmpeg2theora -p preview -o $@ -f yuv4mpegpipe $< # ffmpeg2theora -o $@ -f yuv4mpegpipe $< # ffmpeg2theora --optimize -v 6 -S 1 -o $@ -f yuv4mpegpipe $< #TODO: ggf. noch weiter optimieren: # ffmpeg -i "$<" -deinterlace -s 656x480 -cropleft 8 -cropright 8 -f yuv4mpegpipe - | $(DENOISER) | ffmpeg2theora --optimize -v 5 -S 1 -o $@ -f yuv4mpegpipe - ffmpeg -i "$<" -deinterlace -s $(DEFAULT_RES) $(CROP) -f yuv4mpegpipe - | $(DENOISER) | ffmpeg2theora --optimize -v 5 -S 1 -o $@ -f yuv4mpegpipe - # # Nach H.264 encoden # #BITRATE=662 # an Test-Video-Stück ermittelt zum Größenausgleich zu Theora-Version (XXX: war wohl falsch berechnet) #BITRATE=680 # neuer Test BITRATE=700 # ursprüngliche Version; wir lassen das mal. Ist gut so. Theora-Dingens war fehlerhaft eingestellt. Repariert. #$(KEY)_VIDEO_default.264: $(Y4MFILE) VPIPE1=videopipe1.y4m VPIPE2=videopipe2.y4m VPIPE3=videopipe3.y4m $(KEY)_VIDEO_default.264: $(INPUTFILE) # Komplizierteste Kombination, die ich ausmachen konnte ;-) : if ! [ -p $(VPIPE1) ]; then mkfifo $(VPIPE1); fi ffmpeg -i "$<" -deinterlace -s $(DEFAULT_RES) $(CROP) -f yuv4mpegpipe - | $(DENOISER) > $(VPIPE1) & x264 --crf 24 --level 30 --subme 7 --analyse none --filter -1,-1 --trellis 2 \ --ref 5 --partitions all --qcomp 0.8 --qpmin 16 --me esa --merange 32 --thread-input \ --8x8dct --direct auto --mixed-refs --progress --output $@ $(VPIPE1) # --filter -1,-1 --bframes 1 --trellis 2 \ ## x264 --bitrate 700 --level 3 --nf --no-cabac --subme 6 --analyse none \ ## --qpmin 16 --vbv-maxrate 1000 --me umh --merange 12 --thread-input \ ## --progress --no-psnr --output $@ $(VPIPE1) # x264 --crf 24 --level 30 --subme 7 --me esa \ # --filter -1,-1 --bframes 1 --trellis 2 \ # --ref 5 --partitions all --8x8dct --direct auto --mixed-refs \ # --qcomp 0.8 --qpmin 16 --merange 32 --nr 100 \ # --thread-input --threads $(X264_THREADS) \ # --sar $(SAR) \ # -o $@ $(VPIPE1) rm $(VPIPE1) #IPOD_VIDEO_BITRATE=175 # =700/4 IPOD_VIDEO_BITRATE=138 # =552/4 #$(KEY)_VIDEO_ipod.264: $(SMALL_Y4MFILE) $(KEY)_VIDEO_ipod.264: $(INPUTFILE) # Aus Michaels Notizen entnommene Spaßmatrix (nur die Zeilen ohne CABAC): # # Michaels genereller Rat: --crf=24 # HINWEIS: --crf ist inkompatibel mit Multipass-Encoding! # # Für 640x480: # --no-cabac --level=30 --subme=7 --me=umh --ref=5 --partitions=all --direct=auto --mixed-refs --crf=23 # --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --ref=2 --direct=auto --mixed-refs --no-fast-pskip --no-dct-decimate --qcomp=0.8 --qpmin=15 --vbv-maxrate=1500 --pass=2 # --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --qpmin=15 --pass=1 # --no-cabac --level=30 --subme=7 --me=umh --crf=23 --qpmin=15 # # --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --qpmin=15 --pass=1 # --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --qpmin=15 --pass=2 # # --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --ref=2 --direct=auto --mixed-refs --no-fast-pskip --no-dct-decimate --qcomp=0.7 --qpmin=15 --vbv-maxrate=1500 --merange=32 --nr=100 --pass=2 # --no-cabac --level=30 --subme=7 --me=umh --crf=23 # --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --ref=2 --direct=auto --mixed-refs --no-fast-pskip --no-dct-decimate --qcomp=0.8 --qpmin=15 --vbv-maxrate=1500 --pass=2 # --no-cabac --level 30 --subme 7 --me umh --bitrate 700 --ref 2 --partitions p8x8,b8x8 --mixed-refs --qpmin 16 --vbv-maxrate 1500 --merange 12 --filter=-1,-1 --no-psnr --thread-input --pass=1 # --no-cabac --level=30 --subme=7 --me=umh --crf=24 # # --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --pass=1 # --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --pass=2 # # Für 320x240: # --no-cabac --level=13 --subme=7 --me=umh --bitrate=552 --ref=5 --partitions=all --direct=auto --mixed-refs --no-fast-pskip --no-dct-decimate --qcomp=0.7 --qpmin=20 320x240 # --no-cabac --level=13 --subme=6 --me=umh --bitrate 110 --ref=5 --fps=25 --pass=1 320x240 # --no-cabac --level=13 --subme=6 --me=umh --bitrate 190 --ref=5 --fps=25 --pass=1 320x240 # # # # # Laut kann der iPod classic: # H.264 video, up to 1.5 Mbps, 640 by 480 pixels, 30 frames per second, Low-Complexity version of the H.264 Baseline Profile with AAC-LC audio up to 160 Kbps, 48kHz, stereo audio in .m4v, .mp4, and .mov file formats # H.264 video, up to 2.5 Mbps, 640 by 480 pixels, 30 frames per second, Baseline Profile up to Level 3.0 with AAC-LC audio up to 160 Kbps, 48kHz, stereo audio in .m4v, .mp4, and .mov file formats # MPEG-4 video, up to 2.5 Mbps, 640 by 480 pixels, 30 frames per second, Simple Profile with AAC-LC audio up to 160 Kbps, 48kHz, stereo audio in .m4v, .mp4, and .mov file formats # Das Display ist allerdings nur 320x240 groß, also bringt uns mehr nix … # # # # # Komplizierte und hoffentlich noch sinnvolle Kombination: # x264 --crf 24 --no-cabac --level 30 --subme 7 --me esa \ # --ref 5 --partitions all --8x8dct --direct auto --mixed-refs \ # --qcomp 0.8 --qpmin 18 --vbv-maxrate=1500 --merange 32 --nr 100 \ # --thread-input --threads $(X264_THREADS) \ # -o $@ $< if ! [ -p $(VPIPE2) ]; then mkfifo $(VPIPE2); fi ffmpeg -i "$<" -deinterlace -s $(IPOD_RES) $(IPOD_CROP) -f yuv4mpegpipe - | $(DENOISER) > $(VPIPE2) & x264 --crf 24 --no-cabac --level 30 --subme 7 --me esa --vbv-maxrate 1500 --vbv-bufsize 1000\ --ref 2 --partitions all --direct auto --mixed-refs \ --qcomp 0.8 --qpmin 18 --merange 32 --nr 100 \ --thread-input --threads $(X264_THREADS) \ --output $@ $(VPIPE2) # x264 --crf 24 --level 30 --nf --no-cabac --subme 7 --analyse none \ # --ref 5 --partitions all --qcomp 0.8 --qpmin 16 --vbv-maxrate 1000 --me esa --merange 32 --thread-input \ # --sar $(SAR) --8x8dct --direct auto --mixed-refs --progress --no-psnr --output $@ $(VPIPE2) ## x264 --bitrate 700 --level 3 --nf --no-cabac --subme 6 --analyse none \ ## --qpmin 16 --vbv-maxrate 1000 --me umh --merange 12 --thread-input \ ## --progress --no-psnr --output $@ $(VPIPE2) # x264 --crf 24 --no-cabac --level 30 --subme 7 --me esa \ # --filter -1,-1 --bframes 1 --trellis 2 \ # --ref 5 --partitions all --8x8dct --direct auto --mixed-refs \ # --qcomp 0.8 --qpmin 18 --vbv-maxrate=1500 --merange 32 --nr 100 \ # --thread-input --threads $(X264_THREADS) \ # --sar $(SAR) \ # -o $@ $(VPIPE2) rm $(VPIPE2) # --qcomp 0.8 --qpmin 16 --merange 32 --nr 100 \ $(KEY)_VIDEO_high.264: $(INPUTFILE) if ! [ -p $(VPIPE3) ]; then mkfifo $(VPIPE3); fi ffmpeg -i "$<" -deinterlace -s 1440x1080 -croptop 4 -cropbottom 4 -f yuv4mpegpipe - | $(DENOISER) > $(VPIPE3) & # x264 --crf 24 --level 30 --subme 7 --me esa \ # --filter -1,-1 --bframes 1 --trellis 2 \ # --ref 5 --partitions all --8x8dct --direct auto --mixed-refs \ # --qcomp 0.8 --qpmin 16 --merange 32 --nr 100 \ # --thread-input --threads $(X264_THREADS) \ # --sar $(SAR) \ # -o $@ $(VPIPE3) ## x264 --bitrate 700 --level 3 --nf --no-cabac --subme 6 --analyse none \ ## --qpmin 16 --vbv-maxrate 1000 --me umh --merange 12 --thread-input \ ## --progress --no-psnr --output $@ $(VPIPE3) x264 --crf 24 --level 30 --nf --subme 7 --analyse none \ --filter -1,-1 --trellis 2 \ --ref 5 --partitions all --qcomp 0.8 --qpmin 16 --me esa --merange 32 --thread-input \ --8x8dct --direct auto --mixed-refs --progress --nr 100 --output $@ $(VPIPE3) rm $(VPIPE3) # # Ausgabeformate: # AUDIOFINAL=$(KEY)_AUDIO_NORMALIZED-$(AUDIO_NORMALIZE).wav $(KEY)_audio.ogg: $(AUDIOFINAL) oggenc -b 56 -C 1 -o $@ $< @chmod u-w $@ $(KEY)_audio.mp3: $(AUDIOFINAL) lame -b 80 -h $< $@ @chmod u-w $@ $(KEY)_AUDIO.aac: $(AUDIOFINAL) # TODO: besser komprimieren/encoden! Das hier ist noch großer Mist und in der Testphase!!! # faac -q 500 -o $@ $< # faac -b 80 -o $@ $< # faac -b 60 -o $@ $< # faac -b 56 -o $@ $< faac -b 64 -P -X -R 44100 -B 16 -C 1 --mpeg-vers 4 -o $@ $< $(KEY)_video.mp4: $(KEY)_VIDEO_default.264 $(KEY)_AUDIO.aac # MP4Box -add $< -add $(KEY)_AUDIO.aac -mpeg4 $@ MP4Box -add $< -add $(KEY)_AUDIO.aac -new $@ @chmod u-w $@ $(KEY)_video_high.mp4: $(KEY)_VIDEO_high.264 $(KEY)_AUDIO.aac # MP4Box -add $< -add $(KEY)_AUDIO.aac -mpeg4 $@ MP4Box -add $< -add $(KEY)_AUDIO.aac -new $@ @chmod u-w $@ $(KEY)_video.ogg: $(KEY)_VIDEO.ogg $(KEY)_audio.ogg # Theora+Vorbis aus je einem Container in einzelnen OGG-Container muxen. # # Wow, GStreamer ist ja sooo coool (nach ca. 28 h Nachforschungen, # Verwünschungen und großer Verwunderung)! :-D # vlc kann es anscheinend gar nicht, # ffmpeg macht es falsch (das Resultat ist broken), # mit GStreamer klappt es wunderbar! :-) # $(GST_LAUNCH) \ filesrc location="$(KEY)_audio.ogg" '!' oggdemux '!' vorbisparse '!' \ queue ! oggmux name=m '!' filesink location="$@" \ filesrc location="$(KEY)_VIDEO.ogg" '!' oggdemux '!' theoraparse '!' \ queue ! m. @chmod u-w $@ $(KEY)_video.m4v: $(KEY)_VIDEO_ipod.264 $(KEY)_AUDIO.aac # XXX: Auch Audio-Spur neu (kleiner) encoden? # MP4Box -add $< -add $(KEY)_AUDIO.aac -mpeg4 $@ MP4Box -add $< -add $(KEY)_AUDIO.aac -new $@ @chmod u-w $@ #$(KEY)_video.3gp: # machen wir nicht mehr (Stand: 2007-09-10) # @chmod u-w $@ clean: @test "$(KEY)z" != z rm -f $(KEY)_VIDEO_default_264_2pass.log $(KEY)_VIDEO_ipod_264_2pass.log \ $(KEY)_AUDIO* $(KEY)_VIDEO* veryclean: clean @test "$(I_AM_SURE)z" = "yesz" rm -f $(KEY)_audio* $(KEY)_video* .PHONY: all World World-recursive clean veryclean