From e808faf8eb50a619da40bc9a27df2393ffc94040 Mon Sep 17 00:00:00 2001 From: marko Date: Tue, 13 Nov 2018 14:28:18 +0100 Subject: [PATCH] Changes to be committed: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Starkes Komprimieren von png new file: src/Makefiles/Makefile.pngCompress - Dynamische Bitrate, damit eine max. Dateigröße von 10MB eingehalten wird modified: src/Makefiles/Makefile.vidstabTest new file: src/galleryHelper/getVideoDuration.py new file: src/galleryHelper/getVideoDurationJson.py --- .../src/Makefiles/Makefile.pngCompress | 11 +++ .../src/Makefiles/Makefile.vidstabTest | 78 ++++++++++++++----- .../src/galleryHelper/getVideoDuration.py | 18 +++++ .../src/galleryHelper/getVideoDurationJson.py | 68 ++++++++++++++++ 4 files changed, 154 insertions(+), 21 deletions(-) create mode 100644 homepage/redesign2018/markdownExperiment/src/Makefiles/Makefile.pngCompress create mode 100644 homepage/redesign2018/markdownExperiment/src/galleryHelper/getVideoDuration.py create mode 100644 homepage/redesign2018/markdownExperiment/src/galleryHelper/getVideoDurationJson.py diff --git a/homepage/redesign2018/markdownExperiment/src/Makefiles/Makefile.pngCompress b/homepage/redesign2018/markdownExperiment/src/Makefiles/Makefile.pngCompress new file mode 100644 index 0000000..13d6fd3 --- /dev/null +++ b/homepage/redesign2018/markdownExperiment/src/Makefiles/Makefile.pngCompress @@ -0,0 +1,11 @@ +pngCompressed/%.png: %.png + mkdir -p pngCompressed + pngquant --speed 1 --force --output $@ $^ + zopflipng -y --iterations=500 --filters=01234mepb --lossy_8bit --lossy_transparent $@ $@ + +pngCompressed/%.png: %.jpg + mkdir -p pngCompressed + convert $^ $(patsubst %.jpg,%.png,$^) + pngquant --speed 1 --force --output $@ $^ + zopflipng -y --iterations=500 --filters=01234mepb --lossy_8bit --lossy_transparent $@ $@ + rm -f $(patsubst %.jpg,%.png,$^) diff --git a/homepage/redesign2018/markdownExperiment/src/Makefiles/Makefile.vidstabTest b/homepage/redesign2018/markdownExperiment/src/Makefiles/Makefile.vidstabTest index 2da1067..a81df43 100644 --- a/homepage/redesign2018/markdownExperiment/src/Makefiles/Makefile.vidstabTest +++ b/homepage/redesign2018/markdownExperiment/src/Makefiles/Makefile.vidstabTest @@ -1,18 +1,42 @@ FFMPEG = /c/proggis/media/editoren/ffmpeg-4.0.2-win64-static/bin/ffmpeg.exe GUETZLI = /d/projekte/tests/guetzli.git/bin/Release/guetzli.exe -VID_CODEC_HEIGHT = 360 -VID_CODEC_BITRATE = 500k -VID_CODEC = libvpx-vp9 +#DEFAULT_FFMPEG = ffmpeg +DEFAULT_FFMPEG = /c/proggis/media/editoren/ffmpeg-4.0.2-win64-static/bin/ffmpeg.exe + +# Für eine schnelle Komprimierung libvpx, sonst vp9 +DEFAULT_VID_CODEC_HEIGHT = 360 +DEFAULT_VID_CODEC_WIDTH = -2 +DEFAULT_VID_CODEC_BITRATE = 500k +DEFAULT_VID_CODEC = libvpx-vp9 + +# Standardwerte auf die benutzen Variablen schreiben, falls diese noch +# nicht (z.B. aus dem Terminal heraus oder über ein IncludeCfgFile) +# gesetzt worden sind +VID_CODEC_BITRATE := $(if $(VID_CODEC_BITRATE),$(VID_CODEC_BITRATE),$(DEFAULT_VID_CODEC_BITRATE)) +VID_CODEC_HEIGHT := $(if $(VID_CODEC_HEIGHT),$(VID_CODEC_HEIGHT),$(DEFAULT_VID_CODEC_HEIGHT)) +VID_CODEC_WIDTH := $(if $(VID_CODEC_WIDTH),$(VID_CODEC_WIDTH),$(DEFAULT_VID_CODEC_WIDTH)) +VID_CODEC := $(if $(VID_CODEC),$(VID_CODEC),$(DEFAULT_VID_CODEC)) -sourceVideos = $(wildcard videos/.forCompressing/*.video) +targetSourceDir = videos/aufnahmen/ +sourceVideos = $(wildcard videos/.forCompressing/*.video) + vidstabLogs = $(addsuffix .trf, $(basename $(sourceVideos))) -firstPassLogs = $(addsuffix .firstPassLog, $(basename $(sourceVideos))) +firstPassLogs = $(addsuffix .firstPassLog-0.log, $(basename $(sourceVideos))) webmVideos = $(addprefix videos/webm/, $(addsuffix .webm, $(basename $(notdir $(sourceVideos))))) jpegThumbs = $(addprefix videos/thumbnails/, $(addsuffix .jpg, $(basename $(notdir $(sourceVideos))))) +# das result= fehlt absichtlich +ffmpegVideoFilterVidstabDetect = vidstabdetect=shakiness=10:accuracy=15 +# das input= fehlt absichtlich +ffmpegVideoFilterVidstabTransform = vidstabtransform=optzoom=2:interpol=bicubic:smoothing=30 + +ffmpegVideoScaleFilter = scale=$(VID_CODEC_WIDTH):$(VID_CODEC_HEIGHT):sws_flags=lanczos, +ffmpegVideoFilterDeinterlace = yadif, +ffmpegVideoFilterDenoise = hqdn3d, + .SECONDARY: $(vidstabLogs) $(firstPassLogs) @@ -29,31 +53,45 @@ clean: .PHONY: thumbnails thumbnails: $(jpegThumbs) +.PHONY: echo +echo: + @echo $(webmVideos) + @echo $(firstPassLogs) + @echo $(targetSourceDir) + + # Erzeugen der Targets .PHONY: targets targets: - for file in videos/aufnahmen/papaRomy/*.webm;\ + mkdir -p videos/.forCompressing +# for file in videos/aufnahmen/papaRomy/*.webm;\ +# do \ +# checkSum=$$(sha512sum $${file});\ +# ln -f $${file} videos/.forCompressing/$${checkSum%%\ *}.video;\ +# done; + for file in $(targetSourceDir)/*.*;\ do \ checkSum=$$(sha512sum $${file});\ ln -f $${file} videos/.forCompressing/$${checkSum%%\ *}.video;\ done; -videos/.forCompressing/%.trf: videos/.forCompressing/%.video # Die Stabilisierungsberechnung: # eventuell sollte hier die Skalierung vorgeschaltet werden... +videos/.forCompressing/%.trf: videos/.forCompressing/%.video $(FFMPEG) -i $^ \ - -filter:v vidstabdetect=result="$@" \ + -filter:v $(ffmpegVideoFilterDeinterlace)$(ffmpegVideoFilterDenoise)$(ffmpegVideoFilterVidstabDetect):result="$@" \ -f null \ - -videos/.forCompressing/%.log: videos/.forCompressing/%.video videos/.forCompressing/%.trf +videos/.forCompressing/%.firstPassLog-0.log: videos/.forCompressing/%.video videos/.forCompressing/%.trf +# -b:v $(VID_CODEC_BITRATE) \ # First Pass $(FFMPEG) -i $< \ - -filter:v vidstabtransform=smoothing=30:input="$(basename $<).trf",nlmeans=s=6:p=5:r=7,scale=-2:$(VID_CODEC_HEIGHT):sws_flags=sinc,unsharp=5:5:0.8:3:3:0.4 \ + -filter:v $(ffmpegVideoFilterDeinterlace)$(ffmpegVideoFilterDenoise)$(ffmpegVideoFilterVidstabTransform):input="$(basename $<).trf",nlmeans=s=6:p=5:r=7,$(ffmpegVideoScaleFilter)unsharp=5:5:0.8:3:3:0.4 \ -codec:v $(VID_CODEC) \ -pass 1 \ -passlogfile "$(basename $<).firstPassLog" \ - -b:v $(VID_CODEC_BITRATE) \ + -aspect 16:9 \ -threads 1 \ -speed 4 \ -tile-columns 0 \ @@ -68,16 +106,19 @@ videos/.forCompressing/%.log: videos/.forCompressing/%.video videos/.forCompress # target und dependencies müssen noch angepasst werden # Die erste Abhängigkeit muss das quellVideo sein! -videos/webm/%.webm: videos/.forCompressing/%.video videos/.forCompressing/%.trf videos/.forCompressing/%.log +videos/webm/%.webm: videos/.forCompressing/%.video videos/.forCompressing/%.trf videos/.forCompressing/%.firstPassLog-0.log mkdir -p videos/webm + +# -b:v $(VID_CODEC_BITRATE) \ # Second Pass $(FFMPEG) -i $< \ - -filter:v vidstabtransform=smoothing=30:input="$(basename $<).trf",nlmeans=s=6:p=5:r=7,scale=-2:$(VID_CODEC_HEIGHT),unsharp=5:5:0.8:3:3:0.4 \ + -filter:v $(ffmpegVideoFilterDeinterlace)$(ffmpegVideoFilterDenoise)$(ffmpegVideoFilterVidstabTransform):input="$(basename $<).trf",nlmeans=s=6:p=5:r=7,$(ffmpegVideoScaleFilter)unsharp=5:5:0.8:3:3:0.4 \ -codec:v $(VID_CODEC) \ -pass 2 \ -passlogfile "$(basename $<).firstPassLog" \ -deadline best \ - -b:v $(VID_CODEC_BITRATE) \ + -b:v $(shell /d/temp/cwsvJudo/homepage/redesign2018/markdownExperiment/src/galleryHelper/getVideoDurationJson.py $<)k \ + -aspect 16:9 \ -threads 1 \ -speed 0 \ -tile-columns 0 \ @@ -92,14 +133,9 @@ videos/webm/%.webm: videos/.forCompressing/%.video videos/.forCompressing/%.trf videos/thumbnails/%.png: videos/.forCompressing/%.video mkdir -p videos/thumbnails -# $(FFMPEG) -i "$<" -vf "select=gt(scene\,0.4)" -frames:v 5 -vsync vfr -vf scale=-2:$(VID_CODEC_HEIGHT),fps=fps=1/600 "$@" - $(FFMPEG) -i "$<" -vf thumbnail,scale=-2:$(VID_CODEC_HEIGHT) -frames:v 1 "$@" +# $(FFMPEG) -i "$<" -vf "select=gt(scene\,0.4)" -frames:v 5 -vsync vfr -vf $(ffmpegVideoScaleFilter)fps=fps=1/600 "$@" + $(FFMPEG) -i "$<" -vf $(ffmpegVideoScaleFilter)thumbnail -frames:v 1 "$@" videos/thumbnails/%.jpg: videos/thumbnails/%.png $(GUETZLI) --quality 90 "$<" "$@" - -### - -#$(FFMPEG) -i %1 -map 0 -c copy -c:v libvpx-vp9 -pass 1 -passlogfile "%~dpn1.log" -b:v 150K -threads 1 -deadline good -cpu-used 4 -tile-columns 0 -frame-parallel 0 -auto-alt-ref 1 -lag-in-frames 24 -g 9600 -aq-mode 1 -sws_dither none -pix_fmt yuv420p10le -filter:v nlmeans=s=6:p=5:r=7,scale=w=428:h=240:force_original_aspect_ratio=decrease:sws_flags=area:sws_dither=none,crop=trunc(iw/2)*2:trunc(ih/2)*2:0:0 -an -f null NUL -#$(FFMPEG) -i %1 -map 0 -c copy -c:v libvpx-vp9 -pass 2 -passlogfile "%~dpn1.log" -b:v 150K -threads 1 -deadline good -cpu-used 1 -tile-columns 0 -frame-parallel 0 -auto-alt-ref 1 -lag-in-frames 24 -g 9600 -aq-mode 1 -sws_dither none -pix_fmt yuv420p10le -filter:v nlmeans=s=6:p=5:r=7,scale=w=428:h=240:force_original_aspect_ratio=decrease:sws_flags=area:sws_dither=none,crop=trunc(iw/2)*2:trunc(ih/2)*2:0:0 -c:a libopus -b:a 32k -ac 2 -f webm "%~dpn1.webm" diff --git a/homepage/redesign2018/markdownExperiment/src/galleryHelper/getVideoDuration.py b/homepage/redesign2018/markdownExperiment/src/galleryHelper/getVideoDuration.py new file mode 100644 index 0000000..1551fb6 --- /dev/null +++ b/homepage/redesign2018/markdownExperiment/src/galleryHelper/getVideoDuration.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 + +import sys +import subprocess + +#ffprobe = + +def getLength(filename): + result = subprocess.Popen( + ["C:\\proggis\\media\\editoren\\ffmpeg-4.0.2-win64-static\\bin\\ffprobe.exe", filename], + stdout = subprocess.PIPE, stderr = subprocess.STDOUT) +# print( result.stdout.readlines() ) +# for x in result.stdout.readlines(): +# print(x) + return [x for x in result.stdout.readlines() if b"Duration" in x] + +#print( str( getLength(sys.argv[1]) ) ) +getLength(sys.argv[1]) diff --git a/homepage/redesign2018/markdownExperiment/src/galleryHelper/getVideoDurationJson.py b/homepage/redesign2018/markdownExperiment/src/galleryHelper/getVideoDurationJson.py new file mode 100644 index 0000000..62f417d --- /dev/null +++ b/homepage/redesign2018/markdownExperiment/src/galleryHelper/getVideoDurationJson.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 + +# +# Command line use of 'ffprobe': +# +# ffprobe -loglevel quiet -print_format json \ +# -show_format -show_streams \ +# video-file-name.mp4 +# +# man ffprobe # for more information about ffprobe +# + +import subprocess as sp +import json +import sys + + +def probe(vid_file_path): + ''' Give a json from ffprobe command line + + @vid_file_path : The absolute (full) path of the video file, string. + ''' + if type(vid_file_path) != str: + raise Exception('Gvie ffprobe a full file path of the video') + return + + command = ["ffprobe", + "-loglevel", "quiet", + "-print_format", "json", + "-show_format", + "-show_streams", + vid_file_path + ] + + pipe = sp.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT) + out, err = pipe.communicate() + return json.loads(out) + + +def duration(vid_file_path): + ''' Video's duration in seconds, return a float number + ''' + _json = probe(vid_file_path) + + if 'format' in _json: + if 'duration' in _json['format']: + return float(_json['format']['duration']) + + if 'streams' in _json: + # commonly stream 0 is the video + for s in _json['streams']: + if 'duration' in s: + return float(s['duration']) + + # if everything didn't happen, + # we got here because no single 'return' in the above happen. + raise Exception('I found no duration') + #return None + + +if __name__ == "__main__": +# video_file_path = "/tmp/tt1.mp4" + video_file_path = sys.argv[1] + + durationInSec = duration(video_file_path) + rateInKbPerSec = (10 * 1024 * 1024 * 8)/( durationInSec * 1000 ) + #print( duration(video_file_path) ) # 10.008 + print( int(min(500, rateInKbPerSec)) )