IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

recevoir plusieurs flux audio simultanément


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 9
    Points
    9
    Par défaut recevoir plusieurs flux audio simultanément
    Salut à tous,

    Alors voilà, j'ai posté il y a quelques temps au sujet d'un projet sur lequel je travaille, il s'agit d'un chat vocal fait maison.
    Structure client serveur (protocole UDP), des flux d'émission entre 3 et 5ko/s grâce à une compression mp3 avant envoi

    J'ai résolu la grande majorité des problèmes, il m'en reste un sérieux:

    les clients reçoivent plusieurs flux audios distincts sur une même sortie son (un flux par correspondant)

    Je sais que je devrais essayer d’additionner ces données sonores les unes aux autres, mais voilà: j'utilise pymedia, et aprés l'encodage en mp3,
    les paquets qui sont envoyés et reçus par les clients sont de taille variable , je ne peux donc pas utiliser audioop.add pour les mixer (pas en l'état en tout cas)

    Ce que je me disais, c'est que si j'ouvre VLC d'une part, et le lecteur windows d'autre part, j'entendrai les 2 musiques à la fois dans mon casque!

    Donc pourquoi, quand je créé des threads indépendants qui lisent chacun un flux audio, ai-je un son haché et dégu****sse?

    J'espère avoir été clair, n'hésitez pas à me le signaler si ce n'est pas le cas...

    Si vous connaissez un moyen de mixer des flux audios, ou si vous avez n'importe quelle idée qui pourra m'aider, alors ayez pitié d'un pauvre développeur amateur qui surchauffe du ciboulot

    Merci d'avance! et bonne journée!!!

  2. #2
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    Juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 300
    Points : 413
    Points
    413
    Par défaut
    C'est très facile de jouer deux sons en même temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    import pyaudio
    import wave
     
    CHUNK = 1024
     
     
    piste1 = wave.open("piste1.wav", 'rb')
    piste2 = wave.open("piste2.wav", 'rb')
     
    p1 = pyaudio.PyAudio()
    p2 = pyaudio.PyAudio()
     
    stream1 = p1.open(format=p1.get_format_from_width(piste1.getsampwidth()),
                    channels=piste1.getnchannels(),
                    rate=piste1.getframerate(),
                    output=True)
     
    stream2 = p2.open(format=p2.get_format_from_width(piste2.getsampwidth()),
                    channels=piste2.getnchannels(),
                    rate=piste2.getframerate(),
                    output=True)
     
    data1 = piste1.readframes(CHUNK)
    data2 = piste2.readframes(CHUNK)
     
    while data1 != b'' :
        stream1.write(data1)
        stream2.write(data2)
        data2 = piste2.readframes(CHUNK)
        data1 = piste1.readframes(CHUNK)
     
    stream1.stop_stream()
    stream1.close()
    stream2.stop_stream()
    stream2.close()
     
    p1.terminate()
    p2.terminate()
    En revanche je sèche pour la fusion, j'aimerait bien faire de même, j'avais d'ailleurs déjà posté un sujet là dessus ^^
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Salut,

    Je ne pourrais pas te répondre quant au mixage de tes échantillons audio, mais en revanche j'ai une petite idée quant à ton problème de son haché. Si j'ai bien tout compris, Python possède une entité qui s'appelle le GIL. Ce GIL empêche de faire du vrai multithreading, où chaque thread s'exécutera sur un cœur différent et donc avec une réelle exécution parallèle. En fait, cette limitation peut s'appliquer a priori à d'autres langages si tes 2 threads sont sur le même cœur. Un thread s'exécute, sort du son, s'arrête, l'autre s'exécute, le premier ne sort plus de son : son haché ! Voir le module multiprocessing pour contourner cela.

    Btw, ne peux-tu pas utiliser plusieurs instances de VLC plutôt que Windows Media Player ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Salut, et merci à vous

    stalacta, tu as raison, je n'ai pas testé avec pyaudio, comme je communique en mp3 je bossais avec pygame et pymedia
    c'est bon à savoir

    Bktero, au final, j'ai trouvé une solution alternative à ce problème de threading, je m'explique:
    -lorsque j'instancie plusieurs fois la même sortie audio dans un même module, ça plante, tout comme on ne peut pas lancer 2 instances de windows media
    - en revanche si je lance un programme de lacture par fichier tout va bien, ma carte son (ou windows je ne sais pas) s'occupe de mixer tout ça

    du coup j'ai créé un module de lecture du son reçu, et je l'importe dans mon fil principal, ce qui me permet de créer un objet lecture par stream reçu comme si c'était des programmes séparés... et ça a l'air prometteur, les sons d'additionnent deux même!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Autorun pour plusieurs fichiers en simultané sur clé USB
    Par princebaal dans le forum Windows
    Réponses: 1
    Dernier message: 06/10/2005, 13h35
  2. [Réseau] plusieurs flux a partir d'une socket
    Par al85 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 27/01/2005, 18h11
  3. Envoi d'un flux audio entre 2 PC
    Par TheDarkLewis dans le forum Windows
    Réponses: 2
    Dernier message: 30/08/2004, 02h02
  4. Acquerir un flux audio
    Par The Cyber Lewis dans le forum DirectX
    Réponses: 1
    Dernier message: 05/04/2004, 14h13
  5. Peut-on utiliser plusieurs canaux DMA simultanément ?
    Par le mage tophinus dans le forum Assembleur
    Réponses: 18
    Dernier message: 26/09/2003, 09h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo