Enregistrement audio programm=c3=a9 sur un raspberry

9 réponses
Avatar
Geo Cherchetout
Bonjour,

J'ai enfiché une carte son USB sur un des ports de mon raspberry et créé un
script que cron exécute toutes les heures et dont le rôle est d'enregistrer
un signal audio pendant 3599 secondes :

#!/bin/bash
cd /home/pi/clef
arecord -D plughw:1 -t wav -c1 -d 3599 -r 11025 $(date +%d%b%Hh%M).wav

Ça produit des fichiers d'une taille d'environ 40 MiB de la forme
17avril13h00.wav, conformes à mes espérances, mais mon problème est que le
fichier n'est effectivement créé qu'à la fin de la 3599ème seconde. Si
l'alimentation du raspberry s'interrompt avant, les données accumulées (je
ne sais où) depuis le début de l'heure en cours sont perdues.
Comment faire en sorte que le fichier soit effectivement enregistré sur la
clef USB dès le lancement de la commande, avec une taille croissant du début
à la fin ?

Merci d'avance pour vos remarques, questions et suggestions.

9 réponses

Avatar
Geo Cherchetout
Le 17/04/2018 13:59, j'ai écrit :
Bonjour,
J'ai enfiché une carte son USB sur un des ports de mon raspberry et créé un
script que cron exécute toutes les heures et dont le rôle est d'enregistrer
un signal audio pendant 3599 secondes :
#!/bin/bash
cd /home/pi/clef
arecord -D plughw:1 -t wav -c1 -d 3599 -r 11025 $(date +%d%b%Hh%M).wav
Ça produit des fichiers d'une taille d'environ 40 MiB de la forme
17avril13h00.wav, conformes à mes espérances, mais mon problème est que le
fichier n'est effectivement créé qu'à la fin de la 3599ème seconde. Si
l'alimentation du raspberry s'interrompt avant, les données accumulées (je
ne sais où) depuis le début de l'heure en cours sont perdues.
Comment faire en sorte que le fichier soit effectivement enregistré sur la
clef USB dès le lancement de la commande, avec une taille croissant du début
à la fin ?
Merci d'avance pour vos remarques, questions et suggestions.

Tiens, c'est marrant, il a suffit que je poste cet appel à l'aide pour que
le bidule s'aligne sur mon souhait : J'ai à présent sur la clef un fichier
17avril14h00.wav de taille croissant régulièrement. Je ne vois pas ce qui
s'est passé depuis ce matin.
Avatar
Nicolas George
Geo Cherchetout , dans le message <pb4nif$2d17$, a
écrit :
cd /home/pi/clef

... || exit
Sinon tu peux enregistrer dans le répertoire courant.
$(date +%d%b%Hh%M).wav

Quelle horreur ! "%Y%m%d%H%M", et tu auras un tri lexicographique qui
coïncide avec l'ordre chronologique.
Avatar
Geo Cherchetout
Le 17/04/2018 14:11, *Nicolas George* a écrit :
Geo Cherchetout , dans le message <pb4nif$2d17$, a
écrit :
cd /home/pi/clef

.... || exit
Sinon tu peux enregistrer dans le répertoire courant.

Il me semble que c'est bien ce que je fais, non ?
$(date +%d%b%Hh%M).wav

Quelle horreur ! "%Y%m%d%H%M", et tu auras un tri lexicographique qui
coïncide avec l'ordre chronologique.

Lu et approuvé en tous points, merci beaucoup. :-)
Avatar
Nicolas George
Geo Cherchetout , dans le message <pb4t3r$2fqi$, a
écrit :
cd /home/pi/clef

.... || exit
Sinon tu peux enregistrer dans le répertoire courant.

Il me semble que c'est bien ce que je fais, non ?

Non. Tu veux manifestement enregistrer dans /home/pi/clef, mais si par
hasard ce répertoire n'existe pas, le cd échoue mais le script passe à
la suite, et enregistre dans le répertoire d'où il a été lancé. Avec le
« || exit », si cd échoue, le script échoue tout de suite.
Au fait, tu as envisagé d'utiliser la fonction de segmentation de
ffmpeg ? Ça permet d'éviter de fermer et rouvrir la carte son, donc
d'éviter de perdre une seconde.
Avatar
Geo Cherchetout
Le 17/04/2018 15:39, *Nicolas George* a écrit :
Geo Cherchetout , dans le message <pb4t3r$2fqi$, a
écrit :
cd /home/pi/clef

.... || exit
Sinon tu peux enregistrer dans le répertoire courant.

Il me semble que c'est bien ce que je fais, non ?

Non. Tu veux manifestement enregistrer dans /home/pi/clef, mais si par
hasard ce répertoire n'existe pas, le cd échoue mais le script passe à
la suite, et enregistre dans le répertoire d'où il a été lancé. Avec le
« || exit », si cd échoue, le script échoue tout de suite.

OK, je n'ai pas prévu de démonter cette clef très souvent mais je reconnais
n'avoir pas pensé à ce qu'il adviendrait alors des fichiers wav qui
continueraient d'être produits si j'oubliais de commenter la commande dans
ma crontab ou d'ôter le droit d'exécution à mon script. Avec ma tête de
linotte un tel optimisme c'est de l'inconscience.
Au fait, tu as envisagé d'utiliser la fonction de segmentation de
ffmpeg ? Ça permet d'éviter de fermer et rouvrir la carte son, donc
d'éviter de perdre une seconde.

Merci aussi pour cette idée. Je reviendrai chercher de l'aide ici si je n'y
arrive pas tout seul.
Avatar
Geo Cherchetout
Le 17/04/2018 15:39, *Nicolas George* a écrit :
Au fait, tu as envisagé d'utiliser la fonction de segmentation de
ffmpeg ? Ça permet d'éviter de fermer et rouvrir la carte son, donc
d'éviter de perdre une seconde.

Je ne trouve pas comment faire ça dans le man touffu de ffmpeg, mais ce
n'est pas grave. Cron répond bien à mon besoin en me permettant notamment
d'enregistrer seulement dans une plage horaire définie. D'autre part la
perte de quelques secondes toutes les heures ne me gêne absolument pas. Dans
une autre vie peut-être...
Avatar
Nicolas George
Geo Cherchetout , dans le message <pb7ho4$993$, a
écrit :
Je ne trouve pas comment faire ça dans le man touffu de ffmpeg, mais ce
n'est pas grave.

Pour référence, voici un exemple de base :
ffmpeg -f alsa -ar 48000 -ac 2 -i default
-f segment -segment_time 10 -strftime 1 record%H%M%S.wav
Avatar
Geo Cherchetout
Le 18/04/2018 18:34, *Nicolas George* a écrit :
Pour référence, voici un exemple de base :
ffmpeg -f alsa -ar 48000 -ac 2 -i default
-f segment -segment_time 10 -strftime 1 record%H%M%S.wav

Merci, j'espère que cela sera utile à quelqu'un d'autre. Quant à moi je ne
trouve même pas les chaînes de caractères segment_time et strftime dans la
page de man de ffmpeg. Faut-il chercher dans les "SEE ALSO" énumérés en fin
de page ?
(Ma version de ffmpeg est celle qui vient avec debian stretch : 3.2.10-1~deb9u1)
Avatar
Nicolas George
Geo Cherchetout , dans le message <pb80av$fnu$, a
écrit :
Quant à moi je ne
trouve même pas les chaînes de caractères segment_time et strftime dans la
page de man de ffmpeg. Faut-il chercher dans les "SEE ALSO" énumérés en fin
de page ?

Oui : la page de man de ffmpeg a été découpée en plusieurs parties, elle
était trop grosse. Tu as ffmpeg-all pour la page entière, c'est moins
pratique pour une recherche ciblée mais plus pour une recherche
générale.