From 58e21b77c52ff5fedfa26e506402a17e9a89d64a Mon Sep 17 00:00:00 2001 From: romanwarlock Date: Tue, 8 Dec 2020 17:35:03 +0100 Subject: [PATCH] ImageMagick-free --- thumbgen.sh | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 thumbgen.sh diff --git a/thumbgen.sh b/thumbgen.sh new file mode 100644 index 0000000..1a4252d --- /dev/null +++ b/thumbgen.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# +# +# Dependencies/Requirements: +# 1. ffmpeg +# ImageMagick dependence is REMOVED +# +# Usage: +# . th.sh COLUMNS ROWS SIZE INPUT +# +# COLUMNS means number of columns; +# ROWS means nubler of rows; +# SIZE is the length of the longer side of the output, e.g., 1920 if you want +# to get an 1920*1080 output image; +# INPUT is the path to the input file; +# +# Example: +# . th.sh 3 14 1920 video.mp4 +if [[ $# != 4 ]]; then + echo "wrong number of arguments + +Usage: +. th.sh COLUMNS ROWS SIZE INPUT +COLUMNS means number of columns;TILE is in the form 'MxN' (where M * N should match NFRAMES), e.g., 4x4; +ROWS means nubler of rows; +SIZE is the length of the longer side of the output, e.g., 1920 if you want +to get an 1920*1080 output image; +INPUT is the path to the input file; +OUTPUT is the path to the output file (make sure intermediate directories +exist). + +Example: +. th.sh 3 14 1920 video.mp4 +" + return 1 +fi +NFRAMES=$(echo "scale=0;$1*$2" | bc) +TILE=$(echo "$1x$2") +SIZE=$3 +INPUT=$4 +DURX=$(ffmpeg -i "$4" 2>&1 | grep Duration | awk '{print $2}' | tr -d ,) +DURATION=$(ffmpeg -i "$4" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }') +RES=$(ffmpeg -i "$4" 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+') +FILESIZE=$(du -sm "$4" | awk '{print $1}') +TMPDIR=/tmp/thumbnails-${RANDOM}/ +mkdir $TMPDIR +for (( VARIABLE=0; VARIABLE>${TMPDIR}myfile.txt +echo " $RES" >>${TMPDIR}myfile.txt +echo " $FILESIZE Mb" >>${TMPDIR}myfile.txt +echo " $DURX" >>${TMPDIR}myfile.txt +thewidth=$(ffmpeg -i ${TMPDIR}output.jpg 2>&1 |grep Video|awk '{ split( $8, pieces, /[x,]/ ) ; print pieces[1] }') +theheight=$(ffmpeg -i ${TMPDIR}output.jpg 2>&1 |grep Video|awk '{ split( $8, pieces, /[x,]/ ) ; print pieces[2] }') +theheight=$(echo "scale=0;$theheight*$SIZE/$thewidth" | bc) +ffmpeg -i ${TMPDIR}output.jpg -vf scale=${SIZE}x${theheight} -vframes 1 ${TMPDIR}th.jpg +theheight=$(echo "$theheight+150" | bc) +ffmpeg -f lavfi -i color=white:${SIZE}x${theheight} -i ${TMPDIR}th.jpg -filter_complex "[0:v][1:v] overlay=0:150,drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:fontsize=20:fontcolor=black:x=30:y=20:textfile=${TMPDIR}myfile.txt" -vframes 1 th${RANDOM}.jpg