Bonjour,

Tout d'abord, j'aurais pu déposer cette question dans le forum « Programmation multimédia/jeux », mais je pense qu'elle se rapproche plus d'un problème réseau.
Messieurs les modérateurs n'hésitez à déplacer ce sujet le cas échéant.

Avant de poser ma question, un peu d'informations, pour mieux orienter vos réponses :
  • développeur depuis 22 ans dans tous les domaines de l'entreprise, sur gros et mini-systèmes, en Cobol, RPG IV/ILE, et autres joyeusetés.
  • débutant en : python, développement micro-ordinateur et multimédia
  • mon projet : piloter et dialoguer avec une caméra IP, contenant un serveur WEB.

Concernant la caméra, il existe très peu de documentation :
  • la description des fonctions CGI pour la paramétrer et exécuter des commandes de mouvement.
  • une documentation, en chinois, sur un protocole de bas niveau pour envoyer / recevoir l'audio et la video.

Mon problème (enfin !) :
J'ai réussi à implémenter le protocole bas niveau pour déclencher la réception de l'audio : authentification, demande de réception, gestion des différents sockets.
Selon la pauvre documentation, les données reçues sont codées (compressées ?) en ADPCM (lequel ? ça ce n'est pas dit).
Je reçois donc des trames avec :
  • un timestamp (sur 32 bits), étant indiqué, dans la documentation, « (10 ms) » (qu'est-ce donc ?)
  • un numéro de séquence (32 bits), pour vérifier l'ordre des paquets, j'imagine.
  • le moment d'échantillonnage (un décalage en secondes depuis le 01-01-1970 00:00:00)
  • une longueur : toujours 160
  • les données : 160 octets.

Voilà. Comment puis-je reconstituer le son (qui provient du micro de la caméra) ??

Sachant que selon la(les) norme(s) ADPCM, le son est compressé par quartets représentant les différences entre chaque échantillons, plutôt que les échantillons eux-mêmes.
Mais, il faut bien un échantillons non compressé de début, pour appliquer les différences.
De plus, selon la norme, il existe, à intervalles réguliers, un échantillon non compressé pour rattraper les écarts dus aux calculs de décompression.
Pour extraire les quartets des octets reçus, et interpréter leur valeur, j'ai trouvé des algorithmes ; de ce coté là, ça va.
J'ai aussi tenté de passer les 160 octets reçus dans « audioop.adpcm2lin » ; mais sans surprise, cela ne fonctionne pas !

Donc, au final, mon problème est de trouver comment extraire de la trame reçue :
  • l'échantillon de départ
  • l'échantillon de rattrapage
  • la partie des quartets à décompresser.

Si je me suis fourvoyé dans mon analyse, merci de me l'indiquer (gentillement ).

Merci de vos réponses, et, surtout, d'avoir lu jusqu'au bout.

Nov'