Hab mir da mal nen Thumbnailer geschrieben

FreeBSDuser

Well-Known Member
Also.. ich war genervt, dass Xfce mir keine Thumbnails für Videos anzeigt, und den totem thumbnailer wollte ich mir nun nicht wirklich antun. multimedia/ffmpegthumbnailer ist irgendwie mist, segfaulted und ist doof.

Aus dieser Motivation ist ein sh script entstanden, welches nur mit mplayer ein video thumbnail erstellt - sogar mit stylishen filmribbons:


"optional" werden matadaten per png text (key/value pairs) so halbwegs nach freedesktop.org standards ins png gescrieben, dafür muss allerdings imagemagick installiert sein. (Wenns nicht da ist, wirds nicht gemacht)

Ich hab so gar kein plan von sh scripting, deshalb würde ich euch bitten da mal drüber zu schauen.

thumbper.sh :
Code:
#!/bin/sh

#Copyright (c) 2009 FreeBSDuser
#
# This software is provided 'as-is', without any express or implied warranty. 
# In no event will the authors be held liable for any damages arising from the
# use of this software.
#
# Permission is granted to anyone to use this software for any purpose,
# including commercial applications, and to alter it and redistribute it freely,
# subject to the following restrictions:
#
#   1. The origin of this software must not be misrepresented; 
#      you must not claim that you wrote the original software.
#      If you use this software in a product, an acknowledgment in the product 
#      documentation would be appreciated but is not required.
#   2. Altered source versions must be plainly marked as such, and must not be 
#      misrepresented as being the original software.
#   3. This notice may not be removed or altered from any source distribution.

ME=$(cd `dirname "$0"`;pwd)/`basename "$0"`
VIDEOFILE=$(cd `dirname "$1"`;pwd)/`basename "$1"`
OUT=$(cd `dirname "$2"`;pwd)/`basename "$2"`
CWD=`pwd`

[ x$OUT = "x" ] && echo "$0 video.avi thumbnail.png" && exit 1;
TEMP=`mktemp -d /tmp/mplayerthubnailer.XXXXXX` || exit 1
IDs=$(mplayer -nocache -noautosub -nolirc -nojoystick -nomouseinput -noconsolecontrols -identify -idx -vo null -ao null -frames 0 "$VIDEOFILE"| grep ID_)

LENGTH=$(echo $IDs | sed -e 's/.*ID_LENGTH=\([0-9]*\).*/\1/')
WIDTH=$(echo $IDs | sed -e 's/.*ID_VIDEO_WIDTH=\([0-9]*\).*/\1/')
HEIGHT=$(echo $IDs | sed -e 's/.*ID_VIDEO_HEIGHT=\([0-9]*\).*/\1/')
FORMAT=$(echo $IDs | sed -e 's/.*ID_VIDEO_FORMAT=\([a-zA-Z0-9]*\).*/\1/')
BITRATE=$((`echo $IDs | sed -e 's/.*ID_VIDEO_BITRATE=\([0-9]*\).*/\1/'` / 1000))
FPS=$(echo $IDs | sed -e 's/.*ID_VIDEO_FPS=\([0-9]*\.*[0-9]*\).*/\1/')
ACODEC=$(echo $IDs | sed -e 's/.*ID_AUDIO_CODEC=\([a-zA-Z0-9]*\).*/\1/')
ABITRATE=$((`echo $IDs | sed -e 's/.*ID_AUDIO_BITRATE=\([0-9]*\).*/\1/'` / 1000))
ARATE=$(echo $IDs | sed -e 's/.*ID_AUDIO_RATE=\([0-9]*\).*/\1/')

POS=$(($LENGTH / 3))

echo '###################'
echo temp: $TEMP
echo out: $OUT
echo video: $VIDEOFILE
echo source: $ME
echo pos: $POS
echo length: $LENGTH
echo width: $WIDTH
echo height: $HEIGHT
echo format: $FORMAT
echo bitrate: $BITRATE
echo fps: $FPS
echo audio codec: $ACODEC
echo audio bitrate: $ABITRATE
echo audio rate: $ARATE
echo '###################'
echo ""

cd $TEMP
mkfifo fiffo
# <format> <width> <height> <x> <y> <alpha -255 to 0> <visible>
echo "RGBA32 128 128 0 0 -100 0" > fiffo && cat $ME | uudecode -o /dev/stdout | uncompress > fiffo && echo "SHOW" > fiffo &
bPID=$!
mplayer -idx -noautosub -nolirc -nojoystick -nomouseinput -noconsolecontrols -nosound -nocache -frames 1 -vf scale=128:-3,bmovl=0:0:fiffo -vo png:z=9 -ss $POS "$VIDEOFILE"
cd $CWD
# if the mplayer process fails and the fifo is never read, rm -f the fifo does not stop the process
kill -9 $bPID

# add metadata from mplayer to the png
# this depends on imagemagick, add some kind of check
convert $TEMP/00000001.png \
-set Thumb::URI "file://$VIDEOFILE" \
-set Thumb::Movie::Length "$LENGTH" \
-set Thumb::Movie::Width "$WIDTH" \
-set Thumb::Movie::Height "$HEIGHT" \
-set Thumb::Movie::Codec "$FORMAT" \
-set Thumb::Movie::Bitrate "$BITRATE" \
-set Thumb::Audio::Codec "$ACODEC" \
-set Thumb::Audio::Bitrate "$ABITRATE" \
-set Thumb::Audio::Rate "$ARATE" \
-set Software "thumbper" \
-set Thumb::Movie::Fps "$FPS" $TEMP/00000001.png

mv $TEMP/00000001.png $OUT
chown `id -u -r`:`id -g -r` $OUT
chmod 600 $OUT
rm -rf $TEMP

exit 0;

# create overlay image with 128*128 dimensions
# save image as .tga with no compression or other stuff and rip out width*height*4 bytes after skipping 18bytes of header
# dd if=overlay.tga of=overlay2.tga bs=1 count=65536 skip=18
# compress < overlay2.tga | uuencode -
# and append it to this sh script, replacing the existent one

begin 644 -
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
G&VNSP$J2LHDU9BLQFS+%;O*KG`5L4J>JRXXNMJ:A19EEM9E:C:T+
`
end

z.B. machen mir die sed's ärger wenn die klammer nichts matcht und nicht ersetzt wird, dann hab ich die variable mit dem ganzen input voll.

Das hier ist eher als snapshot zu betrachten.

Danke schonmal, und vielleicht kanns ja jemand gebrauchen.
Hat sogar ne Lizenz :D

FreeBSDuser :cool:

EDIT: mit "identify -verbose /path/to/xy.png" können die tags ausgelesen werden. (identify komm auch aus imagemagick)
 
Zuletzt bearbeitet:
Zurück
Oben