lecture.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # -*-coding:Latin-1 -*
  2. """lecture d'un flux audio mp3"""
  3. from time import sleep
  4. from threading import Thread
  5. #modules complémentaires
  6. import pymedia.audio.sound as sound
  7. import pymedia.audio.acodec as acodec
  8. class Lecture(Thread):
  9. """instance de lecture audio d'un flux mp3"""
  10. def __init__(self, identifiant, cparams, debug):
  11. """création du fil de lecture"""
  12. self.Terminated = False
  13. Thread.__init__(self)
  14. self.debug = debug
  15. self.dec = acodec.Decoder(cparams)
  16. self.sortie = sound.Output( cparams["sample_rate"], 1, sound.AFMT_S16_LE, 0 )
  17. if self.debug:
  18. self.recept = open( "{}.mp3".format(identifiant), 'wb' )
  19. def lire(self, recu):
  20. """reception des donnees a lire"""
  21. retour = ""
  22. if recu:
  23. son_decode = self.dec.decode(recu)
  24. if self.debug:
  25. self.recept.write(recu)
  26. if son_decode:
  27. self.sortie.play(son_decode.data)
  28. def run(self):
  29. """boucle vide"""
  30. while not self.Terminated:
  31. sleep(0.1)
  32. def stop(self):
  33. """Fermeture du fil de lecture"""
  34. print("Fin de la lecture\n")
  35. self.Terminated = True
  36. if self.debug:
  37. self.recept.close()
  38. if __name__ == "__main__":
  39. # si lancement direct:
  40. micro = sound.Input( 22050, 1, sound.AFMT_S16_LE, 0 )
  41. micro.start()
  42. cparams= { 'id': acodec.getCodecID( 'mp3' ),
  43. 'bitrate': 32000,
  44. 'sample_rate': 22050,
  45. 'channels': 1 }
  46. ac = acodec.Encoder( cparams )
  47. le = Lecture("test_lecture", cparams, False)
  48. le.start()
  49. i = 0
  50. while True:
  51. try:
  52. i += 1
  53. son = micro.getData()
  54. if son and len(son):
  55. son_encode = ac.encode(son)
  56. print("".format(i))
  57. for fr in son_encode:
  58. print(le.lire(fr))
  59. except KeyboardInterrupt:
  60. break
  61. micro.stop()
  62. le.stop()