Μετατροπή οποιουδήποτε βίντεο σε webm

...βίντεο, ήχος, players, codecs, κλπ (όχι προβλήματα καρτών εδώ)

Συντονιστές: adem1, konnn

Κανόνες Δ. Συζήτησης
Για εγκατάσταση codec, java, flash και εφαρμογών πολυμέσων τρέξτε στο τερματικό
Για ubuntu
sudo apt-get -y install ubuntu-restricted-extras
Για kubuntu
sudo apt-get -y install kubuntu-restricted-extras

Μετατροπή οποιουδήποτε βίντεο σε webm

Δημοσίευσηαπό xXx » 02 Φεβ 2014, 21:24

Καθώς δεν χρησιμοποιώ πλέον windows αναγκάστηκα να βρω μία εναλλακτική για τον συνδυασμό
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 παρακάτω.
Οπότε το βίντεο από την παρακάτω δημοσίευση "ταιριάζει" και για αυτή την έκδοση.
Κάποια στιγμή θα πρέπει να "πιάσω" ένα βίντεο παρουσίασης και γι' αυτή την έκδοση...
Δεσμεύομαι ότι θα το κάνω κάποια στιγμή που θα βρίσκομαι σε "δυνατότερο" υπολογιστή.
Επίσης περιλαμβάνεται αρχείο βοήθειας στο συμπιεσμένο αρχείο.
Τελευταία επεξεργασία από xXx και 13 Μαρ 2014, 01:24, έχει επεξεργασθεί 2 φορά/ες συνολικά
Κυρίως Desktop: MoBo: GA-MA78GM-S2H | CPU: AMD Phenom(tm) II X4 920 2.80 GHz | VGA: NVIDIA Corporation GF119 [GeForce GT 610] | RAM: 3GB DDR2 800 | Audio: Realtek ALC889A (ATI SB) | Audio: NVIDIA Corporation GF119 HDMI | OS: Debian jessie 64bit
Άβαταρ μέλους
xXx
punkTUX
punkTUX
 
Δημοσιεύσεις: 211
Εγγραφή: 05 Μάιος 2010, 16:12
Τοποθεσία: Ελλάδα, Θεσσαλονίκη, Άνω Πόλη
Εκτύπωση

Re: Μετατροπή οποιουδήποτε βίντεο σε webm

Δημοσίευσηαπό xXx » 22 Φεβ 2014, 02:39

Το ίδιο (σχεδόν) πρόγραμμα το έχω μετατρέψει και για Mac OS X.
Η διαφορά εδώ είναι ότι το πρόγραμμα θα κατεβάσει τα απαραίτητα υπο-προγράμματα,
(τα οποία θα μείνουν στο σύστημα, αλλά τοπικά, όχι system-wide) και θα "ξεγελάσει" το
ffmpeg για την ύπαρξη Fontconfig στο σύστημα. Οπότε δεν χρειάζεται η εγκατάσταση του
XQuartz ( εάν βρισκόσαστε σε σύστημα Mountain Lion ή Mavericks όπου και λείπει από το
λειτουργικό οποιαδήποτε εγγενής υποστήριξη Χ ), ούτε Macports Homebrew ή Fink.
Δικό σας:
Κώδικας: Επιλογή όλων
#!/bin/bash
# Συγγραφέας: xXx
# Ημερομηνία: Πέμπτη 20 Φεβρουαρίου 2014 07:22 μ.μ.
# Επεξεργασία: Παρασκευή 28 Φεβρουαρίου 2014 18:16 μ.μ.
# Σκοπός: Εύκολη κωδικοποίηση βίντεο σε μορφή webm
# Υπότιτλοι: Συμπεριλαμβάνονται με ευκρινείς αναλύσεις
# Ευχαριστίες: Johan Aakerlund για την γραμματοσειρά Comfortaa
# Ευχαριστίες: Fabrice Bellard,Michael Niedermayer και την ομάδα του ffmpeg
# Ευχαριστίες: Dag Ågren για το πρόγραμμα The Unarchiver (unar)
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" # Τέλος χρωματισμού
_start="00:06:00" # Το λεπτό έναρξης (ελπίζω να "πιάσω" υπότιτλους εδώ).
_durat="00:02:00" # Δύο λεπτά διάρκεια (αν δεν "πιάσω" αλλάξτε τους χρόνους)
_cores=$(sysctl -n hw.ncpu) # Αριθμός πυρήνων επεξεργαστή
_width="640" # Το πλάτος του τελικού βίντεο
_height169="360" # Το ύψος του τελικού βίντεο για αναλογία 16:9
_height43="480" # Το ύψος του τελικού βίντεο για αναλογία 4:3
_sce="CP1253" # Κωδικοποίηση υποτίτλων Ελληνικά (Windows ANSI CodePage 1253)
_minv="480K" # Ελάχιστος ρυθμός δεδομένων βίντεο (bitrate)
_maxv="480K" # Μέγιστος ρυθμός δεδομένων βίντεο (bitrate)
_stdv="480K" # Σταθερός ρυθμός δεδομένων βίντεο (bitrate)
_mina="64K" # Ελάχιστος ρυθμός δεδομένων ήχου (bitrate)
_maxa="64K" # Μέγιστος ρυθμός δεδομένων ήχου (bitrate)
_stda="64K" # Σταθερός ρυθμός δεδομένων ήχου (bitrate)
_ar="-ar 22050" # Ρυθμός δειγματοληψίας ήχου (sampling rate)
_subs="" # Προς το παρόν δεν κάνει κάτι αυτή η μεταβλητή
_filter="-vf scale=$_width:-1,ass=test2.ass" # Φίλτρα που εφαρμόζονται
clear
cd $(dirname $0)
echo " Αυτό το πρόγραμμα θα επανακωδικοποιήσει το βίντεο"
echo " και τον υπότιτλο που θα του δώσετε σε μορφή webm."
echo " Το νέο βίντεο θα έχει τους υπότιτλους μόνιμα επάνω του,"
echo " και θα είναι έτοιμο να αναπαραχθεί από σύγχρονους φυλλομετρητές."
read -p "$_g Παρακαλώ σύρτε και αφήστε το βίντεο εδώ : $_x" _invid
if [ "$_invid" = "" ]
then
echo "$_r Δεν δώσατε βίντεο."
echo " Το πρόγραμμα αυτό χρειάζεται ένα βίντεο για να λειτουργήσει."
echo " Το πρόγραμμα τερματίστηκε."
read -p " Πατήστε ENTER για έξοδο: $_x" null
exit
fi
read -p "$_g Παρακαλώ σύρτε και αφήστε τον υπότιτλο εδώ : $_x" _insub
if [ "$_insub" = "" ]
then
echo "$_r Δεν δώσατε υπότιτλο."
echo " Το πρόγραμμα αυτό χρειάζεται υπότιτλο και βίντεο για να λειτουργήσει."
echo " Το πρόγραμμα τερματίστηκε."
read -p " Πατήστε ENTER για έξοδο: $_x" null
exit
fi
if [ ! -d bin ]
then
mkdir bin
fi
export PATH=$PATH:$(dirname $0)/bin
if [ ! -d fontconfig ]
then
mkdir fontconfig
fi
echo '<?xml version="1.0"?>' > fontconfig/fonts.conf
echo "<fontconfig>" >> fontconfig/fonts.conf
echo "<dir>$(dirname $0)/fontconfig</dir>" >> fontconfig/fonts.conf
echo "<cachedir>$(dirname $0)/fontconfig</cachedir>" >> fontconfig/fonts.conf
echo "</fontconfig>" >> fontconfig/fonts.conf
export FONTCONFIG_PATH=$(dirname $0)/fontconfig
if [ "$(which unar)" = "" ]
then
echo "$_r Η εφαρμογή unar δεν βρέθηκε στο σύστημα."
echo " Κατεβάζω και ενεργοποιώ τοπικά."
echo " Αυτό θα συμβεί μόνο μία φορά... $_x"
curl -L https://code.google.com/p/theunarchiver/downloads/list 2>/dev/null > tmp.txt
_ecode=$(echo $?)
if [ "$_ecode" = 23 ]
then
echo "$_r Αδυναμία εγγραφής στην τρέχουσα τοποθεσία."
echo " Εκτελέσεστε το πρόγραμμα αυτό από μία άλλη τοποθεσία."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" = 28 ]
then
echo "$_r Λήξη χρόνου σύνδεσης με τον διακομιστή."
echo " Δοκιμάστε πάλι αργότερα."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" = 7 ]
then
echo "$_r Αδυναμία εύρεσης του διακομιστή."
echo " Ξαναδοκιμάστε αργότερα. Ίσως τότε να είναι διαθέσιμος."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" != "0" ]
then
echo "$_r Παρουσιάστηκε σφάλμα με το δίκτυο..."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
_unar=$(grep "^ unar" tmp.txt | grep .zip$ | sed /_/d | sed 's/ //g')
rm tmp.txt
echo "$_r Η τελευταία έκδοση είναι η $_unar $_x"
if [ ! -f $_unar ]
then
curl https://theunarchiver.googlecode.com/files/$_unar -o $_unar
else
echo "$_r Το αρχείο $_unar υπάρχει ήδη. $_x"
fi
unzip $_unar -d bin
rm $_unar
rm bin/lsar
fi
if [ "$(which ffplay)" = "" ]
then
echo "$_r Η εφαρμογή ffplay δεν βρέθηκε στο σύστημα."
echo " Κατεβάζω και ενεργοποιώ τοπικά."
echo " Αυτό θα συμβεί μόνο μία φορά... $_x"
curl --connect-timeout 5 -L http://www.evermeet.cx/ffplay 2>/dev/null > tmp.txt
_ecode=$(echo $?)
if [ "$_ecode" = 23 ]
then
echo "$_r Αδυναμία εγγραφής στην τρέχουσα τοποθεσία."
echo " Εκτελέσεστε το πρόγραμμα αυτό από μία άλλη τοποθεσία."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" = 28 ]
then
echo "$_r Λήξη χρόνου σύνδεσης με τον διακομιστή."
echo " Δοκιμάστε πάλι αργότερα."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" = 7 ]
then
echo "$_r Αδυναμία εύρεσης του διακομιστή."
echo " Ξαναδοκιμάστε αργότερα. Ίσως τότε να είναι διαθέσιμος."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" != "0" ]
then
echo "$_r Παρουσιάστηκε σφάλμα με το δίκτυο..."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
_ffy=$(grep ffplay- tmp.txt | cut -f2 -d\" | head -n 1)
rm tmp.txt
echo "$_r Η τελευταία έκδοση είναι η $_ffy $_x"
if [ ! -f $_ffy ]
then
curl http://www.evermeet.cx/ffplay/$_ffy -o $_ffy
else
echo "$_r Το αρχείο $_ffy υπάρχει ήδη. $_x"
fi
unar -o bin -D $_ffy
rm $_ffy
fi
if [ "$(which ffprobe)" = "" ]
then
echo "$_r Η εφαρμογή ffprobe δεν βρέθηκε στο σύστημα."
echo " Κατεβάζω και ενεργοποιώ τοπικά."
echo " Αυτό θα συμβεί μόνο μία φορά... $_x"
curl -L http://www.evermeet.cx/ffprobe 2>/dev/null > tmp.txt
_ecode=$(echo $?)
if [ "$_ecode" = 23 ]
then
echo "$_r Αδυναμία εγγραφής στην τρέχουσα τοποθεσία."
echo " Εκτελέσεστε το πρόγραμμα αυτό από μία άλλη τοποθεσία."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" = 28 ]
then
echo "$_r Λήξη χρόνου σύνδεσης με τον διακομιστή."
echo " Δοκιμάστε πάλι αργότερα."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" = 7 ]
then
echo "$_r Αδυναμία εύρεσης του διακομιστή."
echo " Ξαναδοκιμάστε αργότερα. Ίσως τότε να είναι διαθέσιμος."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" != "0" ]
then
echo "$_r Παρουσιάστηκε σφάλμα με το δίκτυο..."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
_ffp=$(grep ffprobe- tmp.txt | cut -f2 -d\" | head -n 1)
rm tmp.txt
echo "$_r Η τελευταία έκδοση είναι η $_ffp $_x"
if [ ! -f $_ffp ]
then
curl http://www.evermeet.cx/ffprobe/$_ffp -o $_ffp
else
echo "$_r Το αρχείο $_ffp υπάρχει ήδη. $_x"
fi
unar -o bin -D $_ffp
rm $_ffp
fi
if [ "$(which ffmpeg)" = "" ]
then
echo "$_r Η εφαρμογή ffmpeg δεν βρέθηκε στο σύστημα."
echo " Κατεβάζω και ενεργοποιώ τοπικά."
echo " Αυτό θα συμβεί μόνο μία φορά... $_x"
curl -L http://www.evermeet.cx/ffmpeg 2>/dev/null > tmp.txt
_ecode=$(echo $?)
if [ "$_ecode" = 23 ]
then
echo "$_r Αδυναμία εγγραφής στην τρέχουσα τοποθεσία."
echo " Εκτελέσεστε το πρόγραμμα αυτό από μία άλλη τοποθεσία."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" = 28 ]
then
echo "$_r Λήξη χρόνου σύνδεσης με τον διακομιστή."
echo " Δοκιμάστε πάλι αργότερα."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" = 7 ]
then
echo "$_r Αδυναμία εύρεσης του διακομιστή."
echo " Ξαναδοκιμάστε αργότερα. Ίσως τότε να είναι διαθέσιμος."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
if [ "$_ecode" != "0" ]
then
echo "$_r Παρουσιάστηκε σφάλμα με το δίκτυο..."
echo " Η εφαρμογή τερματίστηκε απρόσμενα. $_x"
rm tmp.txt
exit
fi
_ffm=$(grep ffmpeg- tmp.txt | cut -f2 -d\" | head -n 1)
rm tmp.txt
echo "$_r Η τελευταία έκδοση είναι η $_ffm $_x"
if [ ! -f $_ffm ]
then
curl http://www.evermeet.cx/ffmpeg/$_ffm -o $_ffm
else
echo "$_r Το αρχείο $_ffm υπάρχει ήδη. $_x"
fi
unar -o bin -D $_ffm
rm $_ffm
fi
_comf=$(find fontconfig -name Comfortaa-Light.ttf)
if [ "$_comf" = "" ]
then
echo "$_r Η γραμματοσειρά Comfortaa δεν βρέθηκε.$_x"
echo "$_r Την κατεβάζω και την εγκαθιστώ τοπικά.$_x"
echo " Αυτό θα συμβεί μόνο μία φορά... $_x"
curl -L http://img.dafont.com/dl/?f=comfortaa -o Comfortaa.zip
unzip Comfortaa.zip -d fontconfig
rm Comfortaa.zip
rm fontconfig/{FONTLOG.txt,OFL.txt,donate.html,Comfortaa\ Presentation.png,Comfortaa-Bold.ttf,Comfortaa-Regular.ttf}
else
echo "$_b Η γραμματοσειρά Comfortaa βρέθηκε στο σύστημα.$_x"
fi
echo "$_b Γίνεται ανάλυση του πηγαίου βίντεο... $_x"
_duration=$(ffprobe "$_invid" 2>&1 > /dev/null | grep Duration | sed 's/ / /g' | cut -f1 -d. | cut -f3 -d" ")
_streamsf=$(ffprobe "$_invid" 2>&1 > /dev/null | grep Stream | cut -f1-3 -d:)
_streamsn=$(echo "$_streamsf" | wc -l)
echo "$_b Βρέθηκαν" $_streamsn "ροές δεδομένων στο πηγαίο βίντεο: $_x"
ffprobe "$_invid" 2>&1 > /dev/null | grep Stream | cut -f1-3 -d,
if [ ! -z "$(ffprobe "$_invid" 2>&1 > /dev/null | grep Subtitle)" ]
then
echo "$_b Εντοπίστηκε ροή υποτίτλων στο πηγαίο βίντεο. $_x"
echo "$_b Απενεργοποιώ την πηγαία ροή υποτίτλων. $_x"
_subs="-sn"
fi
echo "$_b Παρακαλώ επιλέξτε τέντωμα εικόνας:"
echo " ┌───────────┐ ┌────────┐ ╭┅┅┅┅┅┅┅╮ "
echo " │ │ │ │ ╭┅┊┅┅┅┅┅┅┅┊┅╮ "
echo " │ a │ │ b │ ┆ ┊ c ┊ ┆ "
echo " │ │ │ │ ╰┅┊┅┅┅┅┅┅┅┊┅╯ "
echo " └───────────┘ └────────┘ ╰┅┅┅┅┅┅┅╯ $_x"
echo " (a)=16:9 (b)=4:3 (c)=Ίδιο με την πηγή "
while true
do
read -p "a,b ή c ;" abc
case $abc in
[Aa]*)
echo "$_b Βελτιστοποίηση υποτίτλων για αναλογία 16:9 $_x"
ffmpeg -sub_charenc $_sce -i file:"$_insub" -scodec ass test.ass 2>/dev/null
cat test.ass | sed s/Arial,16/Comfortaa,22/ | sed s/10,10,10/10,10,26/ | sed s/1,0,2/2,0,2/ > test2.ass
rm test.ass
_filter="-aspect 16:9 -vf scale=$_width:$_height169,ass=test2.ass"
break;;
[Bb]*)
echo "$_b Βελτιστοποίηση υποτίτλων για αναλογία 4:3 $_x"
ffmpeg -sub_charenc $_sce -i file:"$_insub" -scodec ass test.ass 2>/dev/null
cat test.ass | sed s/Arial,16/Comfortaa,18/ | sed s/10,10,10/10,10,34/ | sed s/1,0,2/2,0,2/ > test2.ass
rm test.ass
_filter="-aspect 4:3 -vf scale=$_width:$_height43,ass=test2.ass"
break;;
[Cc]*)
echo "$_b Βελτιστοποίηση υποτίτλων...$_x"
ffmpeg -sub_charenc $_sce -i file:"$_insub" -scodec ass test.ass 2>/dev/null
cat test.ass | sed s/Arial,16/Comfortaa,20/ | sed s/10,10,10/10,10,30/ | sed s/1,0,2/2,0,2/ > test2.ass
rm test.ass
_filter="-vf scale=$_width:trunc(ow/a/2)*2,ass=test2.ass"
break;;
*)
esac
done
echo "$_g Αυτό το πρόγραμμα μπορεί να κωδικοποιήσει πρώτα ένα μικρό δείγμα,"
echo " ώστε να δείτε το αποτέλεσμα και να αποφασίσετε αν θέλετε αλλαγές."
while true
do
echo "$_g Θέλετε ένα δείγμα των δύο λεπτών; $_x"
read -p " Ναί = ($_r y $_x) Όχι = ($_r n $_x) :" yn
case $yn in
[Yy]* )
echo "$_b Η κωδικοποίηση του δείγματος ξεκίνησε! $_x"
echo "$_b Αυτή η εργασία ίσως χρειαστεί πάνω από 2 λεπτά! $_x"
echo "$_r Παρακαλώ περιμένετε να τελειώσει το δείγμα... $_x"
ffmpeg -loglevel panic \
-i "$_invid" $_subs -ss $_start -t $_durat \
-c:v libvpx -minrate $_minv -maxrate $_maxv -b:v $_stdv $_filter \
-c:a libvorbis -minrate $_mina -maxrate $_maxa -b:a $_stda $_ar \
-threads $_cores sample.webm #2>/dev/null
echo "$_b Το δείγμα τελείωσε!"
echo " Κλείστε το παράθυρο για να συνεχίσετε...$_x"
ffplay -loglevel quiet -window_title "Κλείστε αυτό το παράθυρο για να συνεχίσετε." sample.webm
_testwebm=true
break;;
[Nn]* )
_testwebm=false
break;;
* )
echo "$_r Παρακαλώ απαντήστε με ( y ) ή ( n ) $_x"
esac
done
echo "$_b Το βίντεο σας έχει διάρκεια $_duration"
echo " Αυτό σημαίνει πως κατά την επανακωδικοποίηση, θα πρέπει η ένδειξη"
echo "$_r time=xx:xx:xx $_b να φτάσει την τιμή $_r $_duration $_b για να τελειώσει. $_x"
while true
do
echo "$_b Να κωδικοποιηθεί όλο το βίντεο τώρα; $_x"
read -p " Ναί = ($_r y $_x) Όχι = ($_r n $_x) :" yn
case $yn in
[Yy]* )
echo "$_r Παρακαλώ περιμένετε να τελειώσει η κωδικοποίηση... $_x"
echo "$_r Αυτό σημαίνει όταν η κωδικοποίηση φτάσει στο $_duration $_x"
ffmpeg -i "$_invid" $_subs \
-c:v libvpx -minrate $_minv -maxrate $_maxv -b:v $_stdv $_filter \
-c:a libvorbis -minrate $_mina -maxrate $_maxa -b:a $_stda $_ar \
-threads $_cores $(basename "$_invid").webm
echo "$_b Η κωδικοποίηση τελείωσε! $_x"
break;;
[Nn]* )
break;;
* )
echo "$_r Παρακαλώ απαντήστε με ( y ) ή ( n ) $_x"
esac
done
echo "$_b Ευχαριστώ που χρησιμοποιήσατε το πρόγραμμά αυτό! $_x"
echo "$_g Φιλικά: xXx $_x"
rm test2.ass
if [ $_testwebm = true ]
then
rm sample.webm
fi
sleep 3s
exit

Καλές Mac OS X κωδικοποιήσεις ;-)
Τροποποίηση: Παρασκευή 28 φεβρουαρίου
Αιτία: Έγιναν μικρές αλλαγές στο πρόγραμμα για άμεση λειτουργία με διπλό κλικ στο εκτελέσιμο.
Αρκετά πιό φιλικό το πρόγραμμα έτσι, και πιό κοντά στη φιλοσοφία του Mac OS X

Δείτε το βίντεο για να καταλάβετε...

Κυρίως Desktop: MoBo: GA-MA78GM-S2H | CPU: AMD Phenom(tm) II X4 920 2.80 GHz | VGA: NVIDIA Corporation GF119 [GeForce GT 610] | RAM: 3GB DDR2 800 | Audio: Realtek ALC889A (ATI SB) | Audio: NVIDIA Corporation GF119 HDMI | OS: Debian jessie 64bit
Άβαταρ μέλους
xXx
punkTUX
punkTUX
 
Δημοσιεύσεις: 211
Εγγραφή: 05 Μάιος 2010, 16:12
Τοποθεσία: Ελλάδα, Θεσσαλονίκη, Άνω Πόλη
Εκτύπωση


Επιστροφή στο Εφαρμογές για Πολυμέσα

cron