Δημοσιεύτηκε: 22 Φεβ 2014, 02:39
Το ίδιο (σχεδόν) πρόγραμμα το έχω μετατρέψει και για Mac OS X.
Η διαφορά εδώ είναι ότι το πρόγραμμα θα κατεβάσει τα απαραίτητα υπο-προγράμματα,
(τα οποία θα μείνουν στο σύστημα, αλλά τοπικά, όχι system-wide) και θα "ξεγελάσει" το
ffmpeg για την ύπαρξη Fontconfig στο σύστημα. Οπότε δεν χρειάζεται η εγκατάσταση του
XQuartz ( εάν βρισκόσαστε σε σύστημα Mountain Lion ή Mavericks όπου και λείπει από το
λειτουργικό οποιαδήποτε εγγενής υποστήριξη Χ ), ούτε Macports Homebrew ή Fink.
Δικό σας:
Καλές Mac OS X κωδικοποιήσεις
Τροποποίηση: Παρασκευή 28 φεβρουαρίου
Αιτία: Έγιναν μικρές αλλαγές στο πρόγραμμα για άμεση λειτουργία με διπλό κλικ στο εκτελέσιμο.
Αρκετά πιό φιλικό το πρόγραμμα έτσι, και πιό κοντά στη φιλοσοφία του 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
Δείτε το βίντεο για να καταλάβετε...