VirtualDub και AviSynth ( ο οποίος είναι σίγουρα πολύ καλός αλλά όχι αναντικατάστατος ) ώστε να
μπορώ να "καίω" πραγματικά ποιοτικούς υπότιτλους στα βίντεο μου.
Έφτιαξα λοιπόν ένα πρόγραμμα φλοιού για αυτή τη δουλειά.
Το πρόγραμμα εξάγει βίντεο τύπου webm έτοιμα να παίξουν σε οποιονδήποτε σύγχρονο browser.
Είναι όμως εύκολο να το φέρετε στα μέτρα σας, και μιας και λειτουργεί άψογα, είπα να σας το διαθέσω.
Σας το παραδίδω λοιπόν:
- Κώδικας: Επιλογή όλων
#!/bin/bash
### Συγγραφέας: xXx
### Ημερομηνία: Κυριακή 2 Φεβρουαρίου 2014 09:30
### Επεξεργασία: Τετάρτη 12 Μαρτίου 2014 22:56
### Σκοπός: Εύκολη κωδικοποίηση βίντεο σε μορφή webm
### Υπότιτλοι: Συμπεριλαμβάνονται με ευκρινείς αναλύσεις
### Ευχαριστίες: Johan Aakerlund για την γραμματοσειρά Comfortaa
### Ευχαριστίες: Fabrice Bellard,Michael Niedermayer και την ομάδα του ffmpeg
### Ευχαριστίες: burek (ffmpeg.gusari.org) για τα precompiled ffmpeg binaries
### LAST EDIT: MAR 12 2014 22:53 (5th subtitle dialog as sample start time)
### EDIT: 9 MAR 2014 21:22 (Some positional changes to messages)
### EDIT: 9 MAR 2014 17:04 (Minor fixes to displayed messages + cd $0)
### EDIT: 8 MAR 2014 14:09 (Added informative dialogs for downloads)
### EDIT: 8 MAR 2014 13:47 (Fixed GUI and unzip (not found) not terminating bugs)
### EDIT: 7 MAR 2014 10:43 (Added download session)
### TODO START ###########################################
### Subtitles: Take the five first dialogs for preview ###
### TODO END #############################################
#########################################################################
################# Εδώ μπορείτε να αλλάξετε τις ρυθμίσεις ################
#########################################################################
maxw="" # Μέγιστο μέγεθος εξαγόμενου βίντεο ("" = δεν εφαρμόζεται) #
cuttim="60" # Χρόνος διάρκειας του δείγματος (1 λεπτό) #
minv="600K" # Χαμηλότερη τιμή ρυθμού δεδομένων βίντεο #
maxv="600K" # Υψηλότερη τιμή ρυθμού δεδομένων βίντεο #
stdv="600K" # Μέσος όρος ρυθμού δεδομένων βίντεο #
mina="64K" # Χαμηλότερη τιμή ρυθμού δεδομένων ήχου #
maxa="64K" # Υψηλότερη τιμή ρυθμού δεδομένων ήχου #
stda="64K" # Μέσος όρος ρυθμού δεδομένων ήχου #
ar="22050" # Ρυθμός δειγματοληψίας ήχου (sample rate) #
sce="CP1253" # Κωδικοποίηση πηγαίων υποτίτλων (Ελληνική - Αγγλική) #
#########################################################################
cores=$(cat /proc/cpuinfo | grep -c vendor_id) # Αριθμός πυρήνων επεξεργαστή
_arch=$(uname -m)
### Χρωματισμός των μηνυμάτων ###
esc="" # Ειδικός χαρακτήρας (ESCAPE)
_r="${esc}[1m${esc}[31m" # Κόκκινο χρώμα
_g="${esc}[1m${esc}[32m" # Πράσινο χρώμα
_b="${esc}[1m${esc}[34m" # Μπλέ χρώμα
_y="${esc}[1m${esc}[33m" # Κίτρινο χρώμα
_x="${esc}[22m${esc}[0m" # Τέλος χρωματισμού
### Αλλαγή τοποθεσίας σε αυτήν, στην οποία βρίσκεται το πρόγραμμα #############
cd $(dirname $0)
if [ "$(which xdg-user-dir)" != "" ] #\
then # \
dsktp=$(xdg-user-dir DESKTOP) # \Ορισμός Επιφάνειας Εργασίας
else # /
dsktp="$HOME/Desktop" # /
fi #/
### Αποτροπή λειτουργίας αν λείπει το iconv ###################################
if [ "$(which iconv)" = "" ]
then
echo "$_r Το πρόγραμμα iconv δεν βρέθηκε στο σύστημα σας!"
echo " Αν και αυτό είναι απίθανο, συνέβη σε εσάς..."
echo " Παρακαλώ εγκαταστήστε το και ξαναπροσπαθήστε."
echo " Δοκιμάστε: sudo apt-get install libc-bin (για Debian συστήματα)."
echo " Το πρόγραμμα τερματίστηκε πρόωρα. $_x"
read -p "Πατήστε ENTER για έξοδο..." none
exit
fi
### Αποτροπή λειτουργίας αν τρέχει από πραγματική κονσόλα #####################
if [ "$(tty | grep pts)" = "" ]
then
echo "$_r Please use this program from within a GUI. $_x"
echo "$_r Program terminated. $_x"
read -p "Press ENTER to exit " none
exit
fi
### Αποτροπή λειτουργίας αν λείπει το bc ######################################
if [ "$(which bc)" = "" ]
then
echo "$_r Το πρόγραμμα bc δεν βρέθηκε στο σύστημα σας!"
echo " Το πρόγραμμα αυτό είναι απαραίτητο για τον υπολογισμό"
echo " δεκαδικών αριθμών. Εγκαταστήστε το και ξαναπροσπαθήστε."
echo " Το πρόγραμμα $(basename $0) τερματίστηκε πρόωρα. $_x"
read -p "Πατήστε ENTER για έξοδο..." none
exit
fi
### Έλεγχος πρώτης χρήσης #####################################################
if [ ! -d bin ]
then
echo "$_b Εντοπίστηκε χρήση πρώτης φοράς."
echo " Πολλά από τα παρακάτω βήματα δεν θα επαναληφθούν"
echo " στις επόμενες χρήσεις αυτού του προγράμματος."
echo " Παρακαλώ περιμένετε μέχρι να συλλέξω τα απαραίτητα"
echo " προγράμματα. Αυτό το μήνυμα δεν θα ξαναεμφανιστεί. $_x"
mkdir bin
fi
### Έλεγχος ύπαρξης εκτελέσιμων και απόκτηση αν δεν υπάρχουν ήδη ##############
if [ -z "$(find bin -name ffprobee)" ]
then
echo "$_b Το πρόγραμμα ffprobe δεν βρέθηκε!"
echo " Γίνεται προσπάθεια απόκτησης από το διαδίκτυο... $_x"
if [ "$_arch" = "x86_64" ]
then
echo "$_b Εντοπίστηκε λειτουργικό 64bit $_x"
_testin=$(ping -q -c3 www.google.gr 2>&1 > /dev/null ; echo $?)
if [ "$_testin" != "0" ]
then
echo "$_r Δεν βρήκα σύνδεση με το διαδίκτυο!"
echo " Επισκευάστε την σύνδεση σας και ξαναπροσπαθήστε."
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
wget -q http://ffmpeg.gusari.org/static/64bit -O ttmmpp.txt
_es=$(echo $?)
if [ "$_es" != 0 ]
then
echo "$_r Δεν μπόρεσα να κατεβάσω ένα απαραίτητο αρχείο!"
echo " Ελέγξτε την σύνδεση σας με το διαδίκτυο και ξαναπροσπαθήστε."
echo " Επίσης ελέγξτε ότι έχετε δικαιώματα εγγραφής στο σημείο:"
echo " $(pwd)"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
_lv=$(cat ttmmpp.txt | grep ffmpeg. | cut -f8 -d\" | tail -n 1)
rm ttmmpp.txt
echo "$_b Η νεότερη έκδοση ffmpeg είναι η:"
echo " $_lv"
echo " Κατεβάζω και αποσυμπιέζω τοπικά... $_x"
echo "$_r Παρακαλώ περιμένετε... $_x"
wget -q http://ffmpeg.gusari.org/static/64bit/$_lv -O ffmpeg.tgz
_es=$(echo $?)
if [ "$_es" != 0 ]
then
echo "$_r Δεν μπόρεσα να κατεβάσω ένα απαραίτητο αρχείο!"
echo " Ελέγξτε την σύνδεση σας με το διαδίκτυο και ξαναπροσπαθήστε."
echo " Επίσης ελέγξτε ότι έχετε δικαιώματα εγγραφής στο σημείο:"
echo " $(pwd)"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
tar -xzf ffmpeg.tgz -C bin
rm ffmpeg.tgz
mv bin/ffmpeg bin/ffmpegg
mv bin/ffprobe bin/ffprobee
echo "$_b Απόκτηση ffmpeg επιτυχής! $_x"
elif [ "$_arch" = "i686" ]
then
echo "$_b Εντοπίστηκε λειτουργικό 32bit $_x"
_testin=$(ping -q -c3 www.google.gr 2>&1 > /dev/null ; echo $?)
if [ "$_testin" != "0" ]
then
echo "$_r Δεν βρήκα σύνδεση με το διαδίκτυο!"
echo " Επισκευάστε την σύνδεση σας και ξαναπροσπαθήστε."
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
wget -q http://ffmpeg.gusari.org/static/32bit -O ttmmpp.txt
_es=$(echo $?)
if [ "$_es" != 0 ]
then
echo "$_r Δεν μπόρεσα να κατεβάσω ένα απαραίτητο αρχείο!"
echo " Ελέγξτε την σύνδεση σας με το διαδίκτυο και ξαναπροσπαθήστε."
echo " Επίσης ελέγξτε ότι έχετε δικαιώματα εγγραφής στο σημείο:"
echo " $(pwd)"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
_lv=$(cat ttmmpp.txt | grep ffmpeg. | cut -f8 -d\" | tail -n 1)
rm ttmmpp.txt
echo "$_b Η νεότερη έκδοση ffmpeg είναι η:"
echo " $_lv"
echo " Κατεβάζω και αποσυμπιέζω τοπικά... $_x"
echo "$_r Παρακαλώ περιμένετε... $_x"
wget -q http://ffmpeg.gusari.org/static/32bit/$_lv -O ffmpeg.tgz
_es=$(echo $?)
if [ "$_es" != 0 ]
then
echo "$_r Δεν μπόρεσα να κατεβάσω ένα απαραίτητο αρχείο!"
echo " Ελέγξτε την σύνδεση σας με το διαδίκτυο και ξαναπροσπαθήστε."
echo " Επίσης ελέγξτε ότι έχετε δικαιώματα εγγραφής στο σημείο:"
echo " $(pwd)"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος.$_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
tar -xzf ffmpeg.tgz -C bin
rm ffmpeg.tgz
mv bin/ffmpeg bin/ffmpegg
mv bin/ffprobe bin/ffprobee
echo "$_b Απόκτηση ffmpeg επιτυχής! $_x"
elif [[ "$_arch" != "x86_64" || "i686" ]]
then
echo "$_r Μη υποστηριζόμενη αρχιτεκτονική λειτουργικού!"
echo " Αυτό το πρόγραμμα δεν θα τρέξει στο σύστημα σας!"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
fi
if [ -z "$(find bin -name ffmpegg)" ]
then
echo "$_b Το πρόγραμμα ffmpeg δεν βρέθηκε!"
echo " Γίνεται προσπάθεια απόκτησης από το διαδίκτυο... $_x"
if [ "$_arch" = "x86_64" ]
then
echo "$_b Εντοπίστηκε λειτουργικό 64bit $_x"
_testin=$(ping -q -c3 www.google.gr 2>&1 > /dev/null ; echo $?)
if [ "$_testin" != "0" ]
then
echo "$_r Δεν βρήκα σύνδεση με το διαδίκτυο!"
echo " Επισκευάστε την σύνδεση σας και ξαναπροσπαθήστε."
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
wget -q http://ffmpeg.gusari.org/static/64bit -O ttmmpp.txt
_es=$(echo $?)
if [ "$_es" != 0 ]
then
echo "$_r Δεν μπόρεσα να κατεβάσω ένα απαραίτητο αρχείο!"
echo " Ελέγξτε την σύνδεση σας με το διαδίκτυο και ξαναπροσπαθήστε."
echo " Επίσης ελέγξτε ότι έχετε δικαιώματα εγγραφής στο σημείο:"
echo " $(pwd)"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
_lv=$(cat ttmmpp.txt | grep ffmpeg. | cut -f8 -d\" | tail -n 1)
rm ttmmpp.txt
echo "$_b Η νεότερη έκδοση ffmpeg είναι η:"
echo " $_lv"
echo " Κατεβάζω και αποσυμπιέζω τοπικά... $_x"
echo "$_r Παρακαλώ περιμένετε... $_x"
wget -q http://ffmpeg.gusari.org/static/64bit/$_lv -O ffmpeg.tgz
_es=$(echo $?)
if [ "$_es" != 0 ]
then
echo "$_r Δεν μπόρεσα να κατεβάσω ένα απαραίτητο αρχείο!"
echo " Ελέγξτε την σύνδεση σας με το διαδίκτυο και ξαναπροσπαθήστε."
echo " Επίσης ελέγξτε ότι έχετε δικαιώματα εγγραφής στο σημείο:"
echo " $(pwd)"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
tar -xzf ffmpeg.tgz -C bin
rm ffmpeg.tgz
mv bin/ffmpeg bin/ffmpegg
mv bin/ffprobe bin/ffprobee
echo "$_b Απόκτηση ffmpeg επιτυχής! $_x"
elif [ "$_arch" = "i686" ]
then
echo "$_b Εντοπίστηκε λειτουργικό 32bit $_x"
_testin=$(ping -q -c3 www.google.gr 2>&1 > /dev/null ; echo $?)
if [ "$_testin" != "0" ]
then
echo "$_r Δεν βρήκα σύνδεση με το διαδίκτυο!"
echo " Επισκευάστε την σύνδεση σας και ξαναπροσπαθήστε."
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
wget -q http://ffmpeg.gusari.org/static/32bit -O ttmmpp.txt
_es=$(echo $?)
if [ "$_es" != 0 ]
then
echo "$_r Δεν μπόρεσα να κατεβάσω ένα απαραίτητο αρχείο!"
echo " Ελέγξτε την σύνδεση σας με το διαδίκτυο και ξαναπροσπαθήστε."
echo " Επίσης ελέγξτε ότι έχετε δικαιώματα εγγραφής στο σημείο:"
echo " $(pwd)"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
_lv=$(cat ttmmpp.txt | grep ffmpeg. | cut -f8 -d\" | tail -n 1)
rm ttmmpp.txt
echo "$_b Η νεότερη έκδοση ffmpeg είναι η:"
echo " $_lv"
echo " Κατεβάζω και αποσυμπιέζω τοπικά... $_x"
echo "$_r Παρακαλώ περιμένετε... $_x"
wget -q http://ffmpeg.gusari.org/static/32bit/$_lv -O ffmpeg.tgz
_es=$(echo $?)
if [ "$_es" != 0 ]
then
echo "$_r Δεν μπόρεσα να κατεβάσω ένα απαραίτητο αρχείο!"
echo " Ελέγξτε την σύνδεση σας με το διαδίκτυο και ξαναπροσπαθήστε."
echo " Επίσης ελέγξτε ότι έχετε δικαιώματα εγγραφής στο σημείο:"
echo " $(pwd)"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος.$_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
tar -xzf ffmpeg.tgz -C bin
rm ffmpeg.tgz
mv bin/ffmpeg bin/ffmpegg
mv bin/ffprobe bin/ffprobee
echo "$_b Απόκτηση ffmpeg επιτυχής! $_x"
elif [[ "$_arch" != "x86_64" || "i686" ]]
then
echo "$_r Μη υποστηριζόμενη αρχιτεκτονική λειτουργικού!"
echo " Αυτό το πρόγραμμα δεν θα τρέξει στο σύστημα σας!"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
fi
if [ ! -d fontconfig ]
then
mkdir fontconfig
fi
if [ -z "$(find fontconfig -name Comfortaa.ttf)" ]
then
echo "$_b Η γραμματοσειρά Comfortaa δεν βρέθηκε στο σύστημα σας! $_x"
echo "$_b Γίνεται έλεγχος ύπαρξης του προγράμματος unzip... $_x"
if [ -z "$(which unzip)" ]
then
echo "$_r Το πρόγραμμα unzip δεν βρέθηκε στο σύστημα σας!"
echo " Χωρίς αυτό δεν μπορώ να αποσυμπιέσω το πακέτο της Comfortaa."
echo " Δεν έγινε προσπάθεια ανάκτησης της Comfortaa από το διαδίκτυο."
echo " Επιλύστε το πρόβλημα με το unzip και ξαναπροσπαθήστε.$_x"
echo " Βοήθεια για μερικές διαφορετικές διανομές:"
echo " sudo pacman -S unzip (Archlinux)."
echo " sudo apt-get install unzip (Debian - Ubuntu)."
echo " slackpkg install infozip (Slackware - Salix - Slax)."
echo " sudo yum install unzip (CentOS - Fedora - RedHat)."
echo " sudo urpmi unzip (Mandriva - Mageia)"
echo " sudo zypper install unzip (OpenSUSE)"
echo "$_r Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
else
echo "$_b Το unzip είναι εντάξει. Συνεχίζω με την γραμματοσειρά."
echo " Γίνεται προσπάθεια απόκτησης της Comfortaa από το διαδίκτυο... $_x"
fi
_testin=$(ping -q -c3 www.google.gr 2>&1 > /dev/null ; echo $?)
if [ "$_testin" != "0" ]
then
echo "$_r Δεν βρήκα σύνδεση με το διαδίκτυο!"
echo " Επισκευάστε την σύνδεση σας και ξαναπροσπαθήστε."
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
fi
echo "$_b Κατεβάζω και αποσυμπιέζω την γραμματοσειρά Comfortaa... $_x"
echo "$_r Παρακαλώ περιμένετε... $_x"
wget -q http://img.dafont.com/dl/?f=comfortaa -O comf.zip
_es=$(echo $?)
if [ "$_es" != 0 ]
then
echo "$_r Δεν μπόρεσα να κατεβάσω την γραμματοσειρά Comfortaa!"
echo " Ελέγξτε την σύνδεση σας με το διαδίκτυο και ξαναπροσπαθήστε."
echo " Επίσης ελέγξτε ότι έχετε δικαιώματα εγγραφής στο σημείο:"
echo " $(pwd)"
echo " Το πρόγραμμα τερματίστηκε λόγω σφάλματος. $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
else
echo "$_b Απόκτηση Comfortaa επιτυχής! $_x"
fi
unzip -qq comf.zip -d fontconfig
rm comf.zip
rm fontconfig/{Comfortaa\ Presentation.png,Comfortaa-Bold.ttf,Comfortaa-Regular.ttf,donate.html,FONTLOG.txt,OFL.txt}
mv fontconfig/Comfortaa-Light.ttf fontconfig/Comfortaa.ttf
fi
echo '<?xml version="1.0"?>' > fontconfig/fonts.conf
echo "<fontconfig>" >> fontconfig/fonts.conf
echo "<dir>$(pwd)/fontconfig</dir>" >> fontconfig/fonts.conf
echo "<cachedir>$(pwd)/fontconfig</cachedir>" >> fontconfig/fonts.conf
echo "</fontconfig>" >> fontconfig/fonts.conf
### Ρύθμιση προσωρινού περιβάλλοντος ##########################################
export FONTCONFIG_PATH=$(pwd)/fontconfig
export PATH=$PATH:$(pwd)/bin
### Δημιουργία των functions για κλήση αργότερα ###############################
makesub()
{
echo ""$_r" Σύρτε και αφήστε τον υπότιτλο εδώ: $_x"
read -p "" insub
insub=$(echo "$insub" | sed s/^\'// | sed s/\'$//)
if [ "$insub" = "" ]
then
echo "$_r Δεν δώσατε υπότιτλο!"
echo " Το πρόγραμμα τερματίστηκε πρόωρα. $_x"
read -p "Πατήστε ENTER για έξοδο... " none
exit
elif [ "$(echo "basename $insub" | grep \.srt$)" = "" ]
then
echo "$_r Το πρόγραμμα υποστηρίζει μόνο subrip (.srt) υπότιτλους."
echo " Το πρόγραμμα τερματίστηκε πρόωρα. $_x"
read -p " Πάτα ENTER για έξοδο..." none
exit
else
iconv -f "$sce" -t UTF8 "$insub" > ttt.srt
tim=$(cat ttt.srt | egrep '(-->)' | head -n 5 | tail -n 1 | cut -f1 -d,)
subh=$(echo $tim | cut -f1 -d: | sed s/^0//)
subm=$(echo $tim | cut -f2 -d: | sed s/^0//)
subs=$(echo $tim | cut -f3 -d: | sed s/^0//)
subhm=$(($subh * 60))
subhs=$(($subhm * 60))
subms=$(($subm * 60))
totalsecs=$(($subhs + $subms + $subs))
cutsec=$(($totalsecs - 4))
ffmpegg -loglevel error -i ttt.srt -scodec ass tt.ass #2>/dev/null
sed -i -e '3iPlayResX: 384\' tt.ass
sed -i -e '4iPlayResY: 288\' tt.ass
rm ttt.srt
fi
}
startf()
{
echo "$_b Η κωδικοποίηση του βίντεο ξεκίνησε!"
echo "$_r Παρακαλώ περιμένετε... $_x"
ffmpegg -y -loglevel error -i "$invid" \
$filter"$filter2" \
$aspect \
-c:v libvpx -minrate "$minv" -maxrate "$maxv" -b:v "$stdv" \
-c:a libvorbis -minrate "$mina" -maxrate "$maxa" -b:a "$stda" -ar "$ar" \
-threads "$cores" "$dsktp"/"$outvid""$named"webm
echo "$_b Η εργασία ολοκληρώθηκε! $_x"
echo "$_b Ευχαριστώ που χρησιμοποιήσατε το πρόγραμμά αυτό! $_x"
echo "$_g Φιλικά: xXx $_x"
if [ "$wantsub" = "true" ]
then
rm ttt.ass
fi
if [ "$_testwebm" = "true" ]
then
echo "$_r Διαγράφω το δείγμα... $_x"
fi
rm "$dsktp"/"$outvid""$named"sample.webm
read -p "$_r Πάτα ENTER για έξοδο: $_x" none
exit
}
startsam()
{
echo "$_b Η κωδικοποίηση του δείγματος ξεκίνησε!"
echo "$_r Παρακαλώ περιμένετε... $_x"
ffmpegg -loglevel error -i "$invid" \
$filter"$filter2" \
$aspect \
$cutvid \
-c:v libvpx -minrate "$minv" -maxrate "$maxv" -b:v "$stdv" \
-c:a libvorbis -minrate "$mina" -maxrate "$maxa" -b:a "$stda" -ar "$ar" \
-threads "$cores" "$dsktp"/"$outvid""$named"sample.webm
echo "$_b Το δείγμα τελείωσε! $_x"
echo "$_r Προσοχή!!! Το δείγμα θα διαγραφεί στο επόμενο βήμα!!! $_x"
echo "$_b Εξετάστε το δείγμα και απαντήστε ανάλογα στην επόμενη ερώτηση. $_x"
echo "$_b Να κωδικοποιηθεί όλο το βίντεο τώρα; $_x"
while true
do
read -p " Ναί = ("$_g"y"$_x") Όχι = ("$_r"n"$_x") : " yn
case $yn in
[Yy]* )
startf
break;;
[Nn]* )
if [ "$wantsub" = "true" ]
then
rm ttt.ass
fi
echo "$_r Διαγράφω το δείγμα... $_x"
rm "$dsktp"/"$outvid""$named"sample.webm
echo "$_b Ευχαριστώ που χρησιμοποιήσατε το πρόγραμμά αυτό! $_x"
echo "$_g Φιλικά: xXx $_x"
read -p " Πατήστε ENTER για έξοδο..." none
exit
break;;
* )
esac
done
}
asksam()
{
echo "$_g Αυτό το πρόγραμμα μπορεί να κωδικοποιήσει πρώτα ένα μικρό δείγμα,"
echo " ώστε να δείτε το αποτέλεσμα και να αποφασίσετε αν θέλετε αλλαγές."
echo "$_g Θέλετε ένα δείγμα του ενός λεπτού; $_x"
while true
do
read -p " Ναί = ("$_g"y"$_x") Όχι = ("$_r"n"$_x") : " yn
case $yn in
[Yy]* )
_testwebm="true"
startsam
break;;
[Nn]* )
_testwebm="false"
startf
break;;
* )
esac
done
}
echo " Αυτό το πρόγραμμα θα επανακωδικοποιήσει το βίντεο που θα"
echo " του δώσετε σε μορφή webm. Το νέο βίντεο θα είναι έτοιμο"
echo " να αναπαραχθεί από σύγχρονους φυλλομετρητές. Επίσης σας"
echo " παρέχεται η δυνατότητα ενσωμάτωσης μόνιμων υποτίτλων."
echo "$_r"" Σύρτε και αφήστε το βίντεο εδώ: $_x"
read -p "" invid
### Απογύμνωση του ονόματος αρχείου από τυχόν έξτρα χαρακτήρες (')
invid=$(echo "$invid" | sed s/^\'//g | sed s/\'$//g)
if [ "$invid" = "" ]
then
echo ""$_r"Σφάλμα!" "Δεν δώσατε βίντεο!"
echo "Το πρόγραμμα τερματίστηκε! "$_x""
read -p "Πατήστε ENTER για έξοδο..." none
exit
fi
### Έλεγχος αν το αρχείο βίντεο είναι όντως αρχείο, ή τρίχες κατσαρές ###
chkinvid=$(file "$invid" 2>&1 > /dev/null ; echo $?)
if [ "$chkinvid" != "0" ]
then
echo "$_r Το αρχείο βίντεο που δώσατε δεν υπάρχει!"
echo " Το πρόγραμμα τερματίστηκε πρόωρα. $_x"
read -p " Πατήστε ENTER για έξοδο..."
exit
fi
echo "$_g Θέλετε να ενσωματώσετε υπότιτλους στο νέο βίντεο; $_x"
while true
do
read -p " Ναί = ("$_g"y"$_x") Όχι = ("$_r"n"$_x") : " yn
case $yn in
[Yy]* )
wantsub=true
makesub
break;;
[Nn]* )
wantsub=false
break;;
* )
esac
done
# Απογύμνωση του πηγαίου βίντεο από την κατάληξη (.mkv,.mp4,.webm,.m4v,.avi κλπ)
outvid=$(basename "$invid" | rev | cut -f2- -d. | rev)
# Συλλογή πληροφοριών του πηγαίου βίντεο σε μία μεταβλητή $vidata (στη προσωρινή μνήμη)
vidata=$(ffprobee "$invid" 2>&1 > /dev/null)
# Διάφοροι υπολογισμοί με χρήση της $vidata και δημιουργία νέων μεταβλητών
### Εξαγωγή διάρκειας πηγαίου βίντεο ###
dur=$(echo $vidata | grep -oE "Duration: [0-9][0-9]:[0-9][0-9]:[0-9][0-9]")
dur=$(echo $dur | cut -f2 -d" ")
### Εξαγωγή ωρών διάρκειας πηγαίου βίντεο ###
hour=$(echo $dur | cut -f1 -d: | sed s/^0//)
### Μετατροπή ωρών πηγαίου βίντεο σε λεπτά ###
hour1=$(( $hour * 60 ))
### Μετατροπή λεπτών των προηγούμενων ωρών σε δευτερόλεπτα ###
hour2=$(( $hour1 * 60 ))
### Εξαγωγή λεπτών του πηγαίου βίντεο ###
minu=$(echo $dur | cut -f2 -d: | sed s/^0//)
### Μετατροπή λεπτών του πηγαίου βίντεο σε δευτερόλεπτα ###
minu1=$(( $minu * 60 ))
### Εξαγωγή δευτερολέπτων του πηγαίου βίντεο ###
seco=$(echo $dur | cut -f3 -d: | sed s/^0//)
### Άθροιση όλων των δευτερολέπτων ###
dursec=$(( $hour2 + $minu1 + $seco ))
### Εξαγωγή του τύπου κωδικοποίησης του εικόνας πηγαίου βίντεο ###
vidt=$(echo $vidata | grep -oE "Video: .{0,6}")
vidt=$(echo $vidt | cut -f2 -d" ")
### Εξαγωγή ρυθμού δεδομένων εικόνας ###
vidb=$(echo $vidata | grep -oE "bitrate: .{0,9}")
vidb=$(echo $vidb | cut -f2-3 -d" ")
### Εξαγωγή τύπου κωδικοποίησης ήχου πηγαίου βίντεο ###
audt=$(echo $vidata | grep -oE "Audio: .{0,9}")
audt=$(echo $audt | cut -f2 -d" ")
### Εξαγωγή ρυθμού δεδομένων κωδικοποίησης ήχου πηγαίου βίντεο ###
audt2=$(echo $vidata | grep -oE "[0-9]"\+" Hz" | sed s/,//)
### Εξαγωγή ρυθμού δειγματοληψίας ήχου πηγαίου βίντεο ###
audt3=$(echo $vidata | grep -oE "Hz, [a-z]"\+", " | sed s/,//g | sed s/Hz//)
### Εξαγωγή αναλογίας εικόνας πηγαίου βίντεο ###
dar=$(echo $vidata | grep -oE "DAR [0-9]?[0-9]?[0-9]?[0-9]:[0-9]?[0-9]?[0-9]?[0-9]")
dar=$(echo $dar | cut -f2 -d" ")
### Εξαγωγή μεγέθους πλάτους και ύψους εικόνας πηγαίου βίντεο ###
vidata2=$(for i in $vidata; do echo $i; done | grep [0-9][0-9][0-9]x[0-9][0-9][0-9])
vidata3=$(echo $vidata2 | sed s/,//g | cut -f1 -d" ")
vidw=$(echo $vidata3 | cut -f1 -dx)
vidh=$(echo $vidata3 | cut -f2 -dx)
### Κρατάμε τα αυθεντικά μήκη και πλάτη (ίσως τα χρειαστούμε στο μέλλον) ###
vidwo=$vidw
vidho=$vidh
### Υπολογισμός αναλογιών πηγαίου βίντεο ###
asprat=$(echo "$vidwo / $vidho" | bc -l | cut -c1-4 | sed s/\\.//)
### Εφαρμογή του μέγιστου πλάτους βίντεο μόνο αν αυτό ορίζεται παραπάνω ###
if [ "$maxw" != "" ]
then
### Και μόνο αν αυτό είναι μικρότερο του αρχικού μεγέθους του πηγαίου βίντεο ###
if [ "$vidw" -gt "$maxw" ]
then
vidw=$maxw
maxwapply="true"
else
vidw=$vidw
fi
fi
### Έλεγχος αν αναφέρεται η αναλογία εικόνας (16:9 4:3 κλπ) ###
### Αν δεν αναφέρεται, αντικατάσταση με ένα κατανοητό μήνυμα ###
if [[ "$dar" = "" ]]; then
dar="Δεν αναφέρεται"
fi
### Αποτύπωση στην οθόνη του χρήστη όσων πληροφοριών συλλέξαμε ###
### πρωτύτερα για τις ιδιότητες του πηγαίου βίντεο ###
clear
echo " Πληροφορίες πηγαίου βίντεο:"
echo " ┌───────────────────────────────────────────────────────────┐"
echo " │ "$_b"Διαστάσεις"$_x": "$_r"$vidata3"$_x""
echo " │ "$_b"Αναλογία"$_x": "$_r"$dar"$_x""
echo " │ "$_b"Διάρκεια"$_x": "$_r"$dur"$_x""
echo " │ "$_b"Βίντεο"$_x": "$_r"$vidt"$_x" "$_b""με ρυθμό δεδομένων"$_x" "$_r""$vidb"$_x""
echo " │ "$_b"Ήχος"$_x": "$_r"$audt $audt2 $audt3"$_x" "
echo " └───────────────────────────────────────────────────────────┘"
### Υπολογισμός αρχής κοπής δείγματος στο 1/3 του συνολικού χρόνου ###
if [ "$cutsec" = "" ]
then
cutsec=$(( $dursec / 3 ))
else
cutsec=$cutsec
fi
### Αν το πηγαίο βίντεο είναι μικρότερο από 4 λεπτά δεν θα κοπεί δείγμα ###
### Έτσι αποφεύγουμε την παραγωγή σφάλματος λόγω χρόνου που δεν υπάρχει ###
if [ $dursec -lt 240 ]
then
echo " "$_r"Πολύ μικρό μήκος βίντεο..."
echo " Δεν θα δημιουργηθεί δείγμα! "$_x""
cutvid=""
else
cutvid="-ss $cutsec -t $cuttim"
fi
vidw16=$vidw
vidw43=$vidw
vidh16=$(($vidw16 * 9 / 16 / 2 * 2))
vidh43=$(($vidw43 * 3 / 4 / 2 * 2))
if [ $vidh16 -gt $vidh ]
then
vidh16=$vidh
vidw16=$(($vidh16 * 16 / 9 / 2 * 2))
fi
if [ $vidh43 -gt $vidh ]
then
vidh43=$vidh
vidw43=$(($vidh43 * 4 / 3 / 2 * 2))
fi
echo " Το νέο βίντεο σας θα γίνει" "$vidw16"x"$vidh16" "αν επιλέξετε 16:9"
echo " Το νέο βίντεο σας θα γίνει" "$vidw43"x"$vidh43" "αν επιλέξετε 4:3"
### Διάλογος για επιλογή αναλογίας εικόνας του εξαγόμενου βίντεο ###
echo ""$_g" Τι αναλογίες θέλετε να έχει το εξαγόμενο βίντεο;"$_x""
echo " ┌─────────────┐ ┌─────────┐ ╭┅┅┅┅┅┅┅╮ "
echo " │ │ │ │ ╭┅┊┅┅┅┅┅┅┅┊┅╮ "
echo " │ a │ │ b │ ┆ ┊ c ┊ ┆ "
echo " │ │ │ │ ╰┅┊┅┅┅┅┅┅┅┊┅╯ "
echo " └─────────────┘ └─────────┘ ╰┅┅┅┅┅┅┅╯ "
while true
do
read -p " "$_r"16:9"$_x"=($_r"a"$_x) "$_b"4:3"$_x"=("$_b"b"$_x") "$_g"Χωρίς αλλαγή"$_x"=("$_g"c"$_x") " abc
case $abc in
[aA]*)
vidout="wide"
if [ "$wantsub" = true ]
then
echo "$_b Βελτιστοποίηση υποτίτλων για 16:9 ανάλυση... $_x"
cat tt.ass | sed s/Arial,16/Comfortaa,22/ | sed s/10,10,10/10,10,26/ | sed s/1,0,2/2,0,2/ > ttt.ass
rm tt.ass
filter2=",ass=ttt.ass"
else
filter2=""
fi
break;;
[bB]*)
vidout="square"
if [ "$wantsub" = true ]
then
echo "$_b Βελτιστοποίηση υποτίτλων για 4:3 ανάλυση... $_x"
cat tt.ass | sed s/Arial,16/Comfortaa,18/ | sed s/10,10,10/10,10,34/ | sed s/1,0,2/2,0,2/ > ttt.ass
rm tt.ass
filter2=",ass=ttt.ass"
else
filter2=""
fi
break;;
[cC]*)
vidout="same"
named=.nc.
if [ "$wantsub" = "true" ]
then
if [ "$asprat" -gt "177" ]
then
fsize=24
elif [ "$asprat" -eq "177" ]
then
fsize=22
elif [ "$asprat" -gt "133" ]
then
fsize=22
elif [ "$asprat" -eq "133" ]
then
fsize=18
elif [ "$asprat" -gt "120" ]
then
fsize=18
elif [ "$asprat" -eq "120" ]
then
fsize=16
elif [ "$asprat" -lt "120" ]
then
fsize=16
fi
echo "$_b Βελτιστοποίηση υποτίτλων για την τρέχουσα ανάλυση... $_x"
cat tt.ass | sed s/Arial,16/Comfortaa,"$fsize"/ | sed s/10,10,10/10,10,26/ | sed s/1,0,2/2,0,2/ > ttt.ass
rm tt.ass
filter2=",ass=ttt.ass"
else
filter2=""
fi
aspect=""
### Επέτρεψε μόνο συρρίκνωση όχι μεγέθυνση, με διατήρηση αρχικών αναλογιών. ###
### Αλλά μόνο αν το μέγιστο μέγεθος είναι ενεργό. Αν δεν είναι ενεργό, ###
### το εξαγόμενο βίντεο δεν αλλάζει μέγεθος σε σχέση με το πηγαίο ###
### Φυσικά αλλάζει η κωδικοποίηση ;-) ###
if [ "$maxwapply" != "true" ]
then
filter="-vf scale=$vidw:$vidh"
else
filter="-vf scale=$maxw:-1"
fi
asksam
break;;
*)
esac
done
### Διάλογος επιλογής τεντώματος ή ψαλιδίσματος βίντεο ###
echo ""$_g" Πως να προσαρμόσω την παλιά εικόνα στη νέα;"$_x""
echo " Τέντωμα: Παραμόρφωση, χωρίς καθόλου απώλεια εικόνας."
echo " Ψαλίδισμα: Όχι παραμόρφωση, απώλεια μέρους της εικόνας."
while true
do
read -p " "$_r"Τέντωμα"$_x" = ("$_r"s"$_x") ή "$_b"Ψαλίδισμα"$_x" = ("$_b"c"$_x"); " sc
case $sc in
[sS]* )
### Τέντωμα ###
if [ "$vidout" = "wide" ]
then
named=.ws.
aspect="-aspect 16:9"
filter="-vf scale=$vidw16:$vidh16"
asksam
fi
if [ "$vidout" = "square" ]
then
named=.ss.
aspect="-aspect 4:3"
filter="-vf scale=$vidw43:$vidh43"
asksam
fi
break;;
[cC]* )
### Ψαλίδισμα ###
if [ "$maxwapply" = "true" ]
then
if [ "$vidout" = "wide" ]
then
named=.wc.
aspect="-aspect 16:9"
filter="-vf scale=-1:$vidh16,crop=$vidw16:$vidh16"
asksam
fi
if [ "$vidout" = "square" ]
then
named=.sc.
aspect="-aspect 4:3"
filter="-vf scale=-1:$vidh43,crop=$vidw43:$vidh43"
asksam
fi
else
if [ "$vidout" = "wide" ]
then
named=.wc.
aspect="-aspect 16:9"
filter="-vf crop=$vidw16:$vidh16"
asksam
fi
if [ "$vidout" = "square" ]
then
named=.sc.
aspect="-aspect 4:3"
filter="-vf crop=$vidw43:$vidh43"
asksam
fi
fi
break;;
* )
esac
done
Μπορείτε να το κάνετε ότι θέλετε.
Αν μπείτε στον κόπο να το δοκιμάσετε, παρακαλώ όπως δημοσιεύσετε εντυπώσεις,
τυχόν σφάλματα και ιδέες για βελτιώσεις.
Πως το τρέχετε:
Αντιγραφή του κώδικα ( Επιλογή όλων )
Επικόλληση σε ένα νέο ( κενό ) αρχείο κειμένου
Αποθήκευση του κειμένου ως πχ any2webm.sh
- Κώδικας: Επιλογή όλων
chmod +x any2webm.sh
- Κώδικας: Επιλογή όλων
./any2webm.sh
Καλές κωδικοποιήσεις.
έγραψε:Νέα, βελτιωμένη από πολλές απόψεις έκδοση.
Περιλαμβάνει τις ίδιες (και προς το παρόν περισσότερες) δυνατότητες με την έκδοση Mac OS X παρακάτω.
Οπότε το βίντεο από την παρακάτω δημοσίευση "ταιριάζει" και για αυτή την έκδοση.
Κάποια στιγμή θα πρέπει να "πιάσω" ένα βίντεο παρουσίασης και γι' αυτή την έκδοση...
Δεσμεύομαι ότι θα το κάνω κάποια στιγμή που θα βρίσκομαι σε "δυνατότερο" υπολογιστή.
Επίσης περιλαμβάνεται αρχείο βοήθειας στο συμπιεσμένο αρχείο.

