L’objectif de ce billet et de mettre en œuvre un processus de transfert de vidéo depuis un répertoire d’un PC vers le N900 avec un ré-encodage des fichiers afin d’en assurer une lecture optimale sur le terminal. Ce cas d’utilisation s’avère utile quand on veut visionner des programmes TV enregistrés par exemple.
Nous disposons sur le PC d’un répertoire dans lequel on va mettre les vidéos à encoder pour transfert sur le N900. Disons que ce répertoire est le suivant:
/home/thierry/Vidéos/n900
L’idée est de passer au crible le répertoire ci-dessus à la recherche de fichier à convertir. Comme les fichiers ont une résolution d’image variable, nous allons utiliser un script qui sélectionne le bon encodage en fonction du fichier. Le billet précédent montre une correspondance entre chaine de la TNT par ADSL et la taille du fichier encodé.
Le fichier /home/thierry/Vidéos/n900/convert_all.sh suivant contient le script d’encodage:
#!/bin/bash echo "***********************************" echo "* *" echo "* video converter for N900 *" echo "* *" echo "***********************************" INPUT_DIR=. OUTPUT_DIR=$INPUT_DIR/converted # do not allow concurrency if [ -e "$INPUT_DIR/.lock" ]; then exit 1 else touch "$INPUT_DIR/.lock" fi function convert_file { original_def=$2 original_file=$1 converted_file="$OUTPUT_DIR/$original_file.mp4" if [ -e "$converted_file" ]; then return 1 fi if [ $original_def == "mpeg" ]; then SIZE="400x480" elif [ $original_def == "dvd" ]; then SIZE="592x480" elif [ $original_def == "hd" ]; then SIZE="640x480" else echo "format $original_def inconnu" return 1 fi (ffmpeg -i "$original_file" -acodec libfaac -vcodec libx264 -vpre hq -vpre baseline -crf 25 -maxrate 1000k -bufsize 2000k -threads 0 -flags2 -fastpskip -s "$SIZE" "$converted_file" ) & wait if [ $? -eq 0 ]; then rm "$original_file" fi } find $INPUT_DIR -maxdepth 1 -type f ( -name "France 3*.ts" -o -name "France 4*.ts" -o -name "France 5*.ts" -o -name "La Chaîne*.ts" -o -name "NT1*.ts" -o -name "TMC*.ts" ) -print | ( while read i; do convert_file "$i" mpeg; done ) find $INPUT_DIR -maxdepth 1 -type f ( -name "DirectStar*.ts" -o -name "RTL9*.ts" -o -name "AB*.ts" ) -print | ( while read i; do convert_file "$i" dvd; done ) find $INPUT_DIR -maxdepth 1 -type f ( -name "Arte*.ts" -o -name "Direct 8*.ts" -o -name "France 2*.ts" -o -name "NRJ*.ts" ) -print | ( while read i; do convert_file "$i" hd; done ) rm "$INPUT_DIR/.lock"
Ce script encode les fichiers vers le sous répertoire /home/thierry/Vidéos/n900/converted
en supprimant les fichiers originaux après leur conversion.
L’automatisation de la conversion se fait par un script que l’on va mettre dans /etc/crond.hourly/convertReplayN900 dont voici le contenu:
#!/bin/sh N900_DIR=/home/thierry/Vidéos/n900 cd $N900_DIR ./convert_all.sh chown -R thierry:thierry ./converted
Ce script sera lancé toutes les heures. Il exécutera le premier script vu plus haut puis changera le propriétaire des fichiers encodés (ici avec l’utilisateur thierry) car sinon les fichiers encodés appartiendront à root.
Il ne reste plus qu’à plannifier le transfert des fichiers encodés vers le N900. Comme d’habitude, ce sera au terminal d’initier le transfert car il est plus facile d’avoir un deamon rsync sur le PC que sur le N900. On suppose donc que le répertoire contenant les fichiers encodés est accessible par le module videos du serveur rsync.
Voici le script à utiliser depuis le terminal pour y rapatrier les fichiers convertis:
#!/bin/sh rsync -v --remove-sent-files --ignore-existing 192.168.0.12::"videos/n900/converted/*.mp4" /home/user/MyDocs/.videos/replay
Le lecteur prendra soin de modifier l’adresse 192.168.0.12 par celle du PC où se trouve le serveur rsync.
Tags: bash ffmpeg N900 rsync
Hello,
Il semble que la résolution optimale pour le N900 est 800×448.
http://wiki.maemo.org/Video_encoding
Bonsoir,
Vous avez-raison. Cela est dû au fait sur l’algorithme de compression utilise des blocs de 16 pixels donc les dimensions doivent être multiple de 16 pour optimiser le décodage.
Pouvez-vous nous faire partager la modification en publient un patch ?
Cdt.