Après avoir essayé de lire un fichier mkv HD sur la freebox HD, j'ai été confronté à des sacades, du à l'encodage audio du mkv. J'ai donc créé un script permettant de :
- Supprimer un ou tous les sous-titres dans le fichier mkv
- Supprimer une ou toutes les pistes DTS dans le fichier mkv (les canaux DTS ne pouvant être lus par la Freebox HD)
- Convertir une ou toutes les pistes DTS en son AC3
Pour fonctionner, ce script a besoin des paquets suivants :
zenity , mkvtoolnix , libdca , aften
Le script ( Fichier boxit à placer dans /usr/local/bin et à chmod 755) :
Code : Tout sélectionner
#!/bin/sh
# boxIT : Convertisseur de fichier MKV pour la Freebox HD
# Script développé par MASSUCHETTI Jonathan
# Si vous améliorez ce script, merci de m'en faire pars : jonathan.massuchetti@gmail.com
# Si vous redistribuez ce script, ne supprimez pas ces informations, et ajoutez les votres
FILE=$1
if [[ $FILE == "" ]]
then
FILE=`zenity --file-selection --title="Sélectionnez le fichier à traiter"`
fi
if [[ $? -eq 1 ]]
then
kill $$
fi
info=`mkvmerge -i $FILE | grep audio | grep DTS`
if [ -z $info ]
then
zenity --info --title="boxIT" --text="Aucun canal DTS détecté" ; exit 1
fi
base=`basename $FILE`
TMP=`zenity --file-selection --directory --title="Sélectionnez le répertoire de destination"`
if [[ $? -eq 1 ]]
then
kill $$
fi
#### Options d'empaquetage
## Sous-titres
list=`mkvmerge -i $FILE | grep subtitles`
list=$(echo "$list ")
echo "100" |
zenity --progress \
--title="boxIT" \
--text="Analyse du fichier en cours" \
--pulsate \
--auto-close
sub=$(echo $list | sed 's/\(Track ID \([1-9]\+\): \(\([a-zA-Z0-9_-]\+ *\) ([a-zA-Z0-9_-/]\+)\)\)\+/'TRUE' \2 "\3"/g' |
xargs zenity --list \
--checklist \
--separator="," \
--title="boxIT" \
--text="Quels sous-titres voulez-vous empaqueter ?" \
--column="" \
--column="ID" \
--column="Nom de la piste de sous-titres")
if [ -z $sub ]
then
OPT_S="-S"
else
OPT_S="-s $sub"
fi
## DTS à Conserver
list=`mkvmerge -i $FILE | grep audio | grep DTS`
list=$(echo "$list ")
echo "100" |
zenity --progress \
--title="boxIT" \
--text="Analyse du fichier en cours" \
--pulsate \
--auto-close
dts=$(echo $list | sed 's/\(Track ID \([1-9]\+\): \(\([a-zA-Z0-9_-]\+ *\) ([a-zA-Z0-9_-/]\+)\)\)\+/'TRUE' \2 "\3"/g' |
xargs zenity --list \
--checklist \
--separator="," \
--title="boxIT" \
--text="Quelles pistes audios DTS voulez-vous empaqueter ?" \
--column="" \
--column="ID" \
--column="Nom de la piste de sous-titres")
if [ -z $dts ]
then
OPT_A="-A"
else
OPT_A="-a $dts"
fi
#### Choix des Canaux DTS à Convertir
list=`mkvmerge -i $FILE | grep audio | grep DTS`
list=$(echo "$list ")
echo "100" |
zenity --progress \
--title="boxIT" \
--text="Analyse du fichier en cours" \
--pulsate \
--auto-close
dts=$(echo $list | sed 's/\(Track ID \([1-9]\+\): \(\([a-zA-Z0-9_-]\+ *\) ([a-zA-Z0-9_-/]\+)\)\)\+/'TRUE' \2 "\3"/g' |
xargs zenity --list \
--checklist \
--separator=" " \
--title="boxIT" \
--text="Choisissez les pistes audios à convertir" \
--column="" \
--column="ID" \
--column="Nom du canal Audio")
for id in $dts
do
(
mkvextract tracks $FILE $id:"$TMP/$base-$id.dts" &
pid=$!
kill -0 $pid
while [[ $? -eq 0 ]]
do
size=`stat -c %s $TMP/$base-$id.dts`
let "mo = $size / 1048576 "
echo "# Extraction du canal DTS #$id vers $TMP/$base-$id.dts\nCela prend environ 5 minutes\nTaille du fichier : $mo Mo / ~ 1000 Mo" ; sleep 2 ; kill -0 $pid
done
) |
zenity --progress \
--title="boxIT" \
--text="Extraction du canal DTS #$id vers $TMP/$base-$id.dts\nCela prend environ 5 minutes" \
--pulsate \
--auto-close
if [[ $? -eq 1 ]]
then
kill $pid ; kill $$
fi
done
zenity --info --title="boxIT" --timeout="3" --text="L'extraction des canaux DTS est maintenant terminée"
for id in $dts
do
(
dcadec -o wavall $TMP/$base-$id.dts | aften -b 640 - $TMP/$base-$id.ac3 &
pid=$!
kill -0 $pid
while [[ $? -eq 0 ]]
do
size=`stat -c %s $TMP/$base-$id.ac3`
let "mo = $size / 1048576 "
echo "# Convertion du canal DTS #$id vers $TMP/$base-$id.ac3\nCela prend environ 15 minutes\nTaille du fichier : $mo Mo / ~ 750 Mo" ; sleep 2 ; kill -0 $pid
done
) |
zenity --progress \
--title="boxIT" \
--text="Convertion du canal DTS $id vers $TMP/$base-$id.ac3\nCela prend environ 15 minutes" \
--pulsate \
--auto-close
if [[ $? -eq 1 ]]
then
kill $pid ; kill $$
fi
AC3_FILES=$(echo "$AC3_FILES $TMP/$base-$id.ac3")
done
zenity --info --title="boxIT" --timeout="3" --text="La convertion des canaux DTS est maintenant terminée"
zenity --info --title="boxIT" --timeout="3" --text="Nous allons maintenant procéder à l'empaquetage du nouveau fichier MKV.
Les pistes précédemments converties seront automatiquement ajoutées au paquetage"
##### Empaquetage Final
(
mkvmerge -o $TMP/$base-BOXED.mkv $OPT_A $OPT_S $FILE $AC3_FILES &
pid=$!
kill -0 $pid
while [[ $? -eq 0 ]]
do
size=`stat -c %s $TMP/$base-BOXED.mkv`
let "mo = $size / 1048576 "
echo "# Empaquetage du fichier final : $TMP/$base-BOXED.mkv\nCela prend environ 15 minutes\nTaille du fichier : $mo Mo" ; sleep 2 ; kill -0 $pid
done
) |
zenity --progress \
--title="boxIT" \
--text="Empaquetage du fichier final : $TMP/$base-BOXED.mkv\nCela prend environ 15 minutes" \
--pulsate \
--auto-close
if [[ $? -eq 1 ]]
then
kill $pid ; kill $$
fi
zenity --info --title="boxIT" --text="L'empaquetage est terminé"
zenity --question --title="boxIT" --text="Effacer les fichiers temporaires ?"
if [[ $? -eq 0 ]]
then
rm -f $TMP/$base-*.ac3
rm -f $TMP/$base-*.dts
fi
exit 0;
L'icône pour le menu : http://pix.toile-libre.org/upload/origi ... 241805.png
A placer dans /usr/share/icons ou dans ~/.icons
Le chemin donné dans le script est /usr/share/icons/free.png , si vous n'utilisez pas ce chemin pour votre icône, pensez à le changer.
Code : Tout sélectionner
[Desktop Action boxIT]
Exec=boxit %u
Icon=/usr/share/icons/free.png
Name=Convertir pour la FreeBox HD
[Desktop Entry]
Actions=boxIT;
MimeType=
ServiceTypes=
Type=Service
X-KDE-ServiceTypes=KonqPopupMenu/Plugin,,video/x-matroska
X-KDE-Submenu=
Edit 07/05/2010 à 15h30 : Le fichier peut désormais être passé au script comme premier argument
Edit 07/05/2010 à 16h07 : Ajout du menu service pour KDE4.