Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/03/2013, à 00:06

lildadou

[SOLVED] Comportement de script différent selon le context

Bonsoir à tous,
j'utilise le serveur de streaming Subsonic pour écouter de musique sur mon téléphone. Par défaut, subsonic ré-encode la musique qu'il envoie en MP3 (le FLAC en streaming pouvant être un peu lent, surtout en 3G). Si l'idée de compresser de la musique pour la streamer me semble tout à fait justifier, je trouve que le faire en MP3 alors qu'on est quand même en 2013 (nan mais allo!) est un peu une erreur. Du coup, je la compresse en HE-AAC v2 parfaitement adapté à la situation.

Cependant, ffmpeg (l'encodeur utilisé par SubSonic) ne sait pas cracher du MP4 (M4A) sur la sortie standard (not seekable) et il a fallu que je réalise un petit script de substitution à ffmpeg pour encoder vers un fichier, puis balancer le contenu du fichier sur la sortie standard (pour SubSonic).

#/bin/sh
tmpid=`uuid`
username="xbmc"

echo -e "Input: $1 \n\
Output: /tmp/$tmpid.m4a \n\
Bitrate: $2 \n\
ffmpeg stderr:\n" >> /home/$username/.subsonic/aac-convert.log

/usr/local/bin/ffmpeg -i "$1" -codec:a libaacplus -ab $2 /tmp/$tmpid.m4a 2>> /home/$username/.subsonic/aac-convert.log

echo -e "\n\n\n" >> /home/$username/.subsonic/aac-convert.log

cat /tmp/$tmpid.m4a

Ce script fonctionne très très bien. Il récupère les arguments encode quelque part dans /tmp puis balance sur stdout le contenu du fichier.


J'ai voulu améliorer ce script notamment pour éviter les doublons. Plutôt que de générer un nom de fichier temporaire aléatoire qui ne sera plus jamais utilisé, j'utilise SHA pour créer un fichier temporaire en fonction du chemin du fichier à encoder. De cette façon, si le même fichier est demandé il ne sera encodé qu'une seule fois. Voici donc le nouveau script

#/bin/sh
tmpoutfolder="/tmp/subsonic/"
if [ ! -d $tmpoutfolder ]
then
        mkdir -p $tmpoutfolder
fi
tmpid=`echo "$1" | sha1sum`
tmpid=${tmpid:0:40}
tmpout="$tmpoutfolder$tmpid.m4a"
username="xbmc"

echo -e "Input: $1 \n\
Output: $tmpout \n\
Bitrate: $2 " >> /home/$username/.subsonic/aac-convert.log
if [ ! -f $tmpout ]
then
        echo "ffmpeg stderr:" >> /home/$username/.subsonic/aac-convert.log
        /usr/local/bin/ffmpeg -i "$1" -codec:a libaacplus -ab $2 $tmpout 2>> /home/$username/.subsonic/aac-convert.log
else
        echo -e "ffmpeg: Cache matching!\n" >> /home/$username/.subsonic/aac-convert.log
fi

echo -e "\n\n\n" >> /home/$username/.subsonic/aac-convert.log
cat $tmpout

A priori, peu de changement. N'est ce pas? Lorsque je le lance depuis ma console je n'ai aucun problème et ma fenêtre est inondée de caractères spéciaux. Par contre, ça ne fonctionne plus quand c'est SubSonic qui appelle le script!?


Petit à petit j'ai pu identifier la ligne qui causait problème

tmpid=${tmpid:0:40}

mais je ne comprends pas pourquoi elle ne fonctionne pas et encore moins pourquoi elle ne fonctionne pas seulement si c'est SubSonic qui appelle le script!



Quelqu'un peu m'expliquer ce qui cloche?

Dernière modification par lildadou (Le 26/03/2013, à 00:20)

Hors ligne

#2 Le 26/03/2013, à 00:20

lildadou

Re : [SOLVED] Comportement de script différent selon le context

J'ai fini par trouver ^^'
En redirigeant la sortie d'erreur de la commande qui causait problème j'ai pu avoir des indications : "Bad substitution". Le problème venait bêtement de l'interpréteur de commande utilisé ici sh (dash) qui ne comprenait pas la syntaxe de ma substitution. Je connais la différence entre les interpréteur mais comme j'ai mis #/bin/sh et non #!/bin/sh il ne c'est rien passé quand j'ai tenté de basculer sur bash X/

Pour résoudre le problème, il suffisait donc de remplacer #/bin/sh (qui ne veut rien dire) par #!/bin/bash

Hors ligne