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

Python Discussion :

Lancement différé de deux fonctions


Sujet :

Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 11
    Points : 3
    Points
    3
    Par défaut Lancement différé de deux fonctions
    Bonjour,

    je cherche à lire deux audios différents mais différés de 5 secondes. Donc finalement il faut que j'appelle la première fonction qui me permet de lire le 1er audio puis la 2ème fonction (pour le 2eme audio) se lance 5s après.
    J'ai d'abord essayé avec un "time.sleep()" classique mais forcément la lecture du 1er audio est arretée aussi alors que je veux qu'elle continue...

    J'ai tenté ensuite avec le programme ci-joint, les lignes concernant le delai de 5s sont aux dernières lignes. Pourtant en le lançant, mes deux audios sont joués simultanément et non en différé malgré le "Timer". Est-ce que quelqu'un aurait une idée de l'erreur ? (ou du pourquoi du comment !)

    Merci d'avance

    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
     
    import sounddevice as sd
    import soundfile as sf
    import threading
    import time
     
     
    Son1= 'audio1.wav'
    Son2= 'audio2.wav'
     
    def audioFunc(audio, nDevice):
        data1, fs1 = sf.read(audio, dtype='float32')
        L1=[]
        for i in range(50):
            L1.append(data1[i])
        print(L1)
        sd.play(data1, fs1, device=nDevice) 
     
    #LECTURE AUDIOS
     
    duration = len(sf.read(Son2)[0]) # duration of Son2
     
    def start_audio1():
        threading.Thread(target = audioFunc(Son1, 5)).start()
     
     
    def start_audio2():
        while True: # infinite while-loop
            threading.Thread(target = audioFunc(Son2, 6)).start()
            # pause while-loop for duration of Son2
            time.sleep(duration)
     
    #LECTURE DES AUDIOS DIFFERES DE 5 SECONDES
    start_audio1()
    delay=threading.Timer(5, start_audio2())
    delay.start()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par rimalou Voir le message
    Est-ce que quelqu'un aurait une idée de l'erreur ?
    Si vous écrivez threading.Timer(5, start_audio2()) ce n'est pas la fonction qui est passée en paramètre (et qui sera appelée 5 secondes plus tard) mais le retour de cette fonction exécutée immédiatement.
    Pareil pour la construction threading.Thread(target = audioFunc(Son1, 5)) où la difficulté supplémentaire est de passer des paramètres à la fonction appelée.

    Ouvrez la documentation de threading.Timer et threading.Thread pour voir comment faire...

    Ceci corrigé, est ce que vos aurez le résultat attendu? J'en sais rien.

    W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Si vous écrivez threading.Timer(5, start_audio2()) ce n'est pas la fonction qui est passée en paramètre (et qui sera appelée 5 secondes plus tard) mais le retour de cette fonction exécutée immédiatement.
    Pareil pour la construction threading.Thread(target = audioFunc(Son1, 5)) où la difficulté supplémentaire est de passer des paramètres à la fonction appelée.

    Ouvrez la documentation de threading.Timer et threading.Thread pour voir comment faire...

    Ceci corrigé, est ce que vos aurez le résultat attendu? J'en sais rien.

    W
    Bonjour, après recherche, je ne vois pas du tout comment "passer des paramètres à la fonction appelée". j'ai compris cependant que ce n'est pas necessaire d'appeler la fonction après le timer mais bien sur cela ne règle pas le problème principal...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    start_audio1()
    threading.Timer(10, start_audio2()).start()
    A moins que quelqu'un ai une idée, j'ai testé avec une autre méthode (ci-dessous) en attendant, et je rencontre un problème : l'audio1 se lit bien dès le départ, ensuite le timer se lance, mais lorsqu'il est à 0 je veux lancer la lecture de l'audio2 tout en ayant l'audio 1 qui se joue encore, pourtant à chaque fois l'audio2 se lance et l'audio1 se coupe. Une idée? Merci d'avance.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def countdown(h, m, s):
        total_seconds = h * 3600 + m * 60 + s
        while total_seconds > 0:
            timer = datetime.timedelta(seconds = total_seconds)
            print(timer, end="\r")
            # Delays the program one second
            time.sleep(1)
            # Reduces total time by one second
            total_seconds -= 1
        return "Finish"
     
    start_audio1()
    if countdown(0,0,5) == "Finish":
        start_audio2()

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Bonjour,

    Vous aurez beau essayé de comprendre, si vous ne savez pas lire la documentation, difficile de vous aider.

    Regardez comment est appelé la fonction hello... après on verra les erreurs suivantes.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,

    Vous aurez beau essayé de comprendre, si vous ne savez pas lire la documentation, difficile de vous aider.

    Regardez comment est appelé la fonction hello... après on verra les erreurs suivantes.
    ooooook vraiment désolée, je me sens bête je n'ai pas vu ce détail, pourtant primordial...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    start_audio1()
    threading.Timer(5, start_audio2).start()
    Maintenant que les parenthèses sont enlevées... je retrouve le même problème que dans la 2ème méthode que j'ai proposée: l'audio1 se lance, après 5s l'audio2 se lance mais l'audio1 se coupe (au contraire l'audio1 doit continuer sa lecture).

  6. #6
    Membre régulier
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Points : 104
    Points
    104
    Par défaut
    Si un débutant naïf s'en mêle ca pourrait donner..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from threading import Timer 
     
    def hello():
        print("hello, world")
     
    def bye():
        print("bye, bye")
     
    t1 = Timer(5.0, hello)
    t1.start()  
     
    t2 = Timer(10.0, bye)
    t2.start()

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par rimalou Voir le message
    je retrouve le même problème que dans la 2ème méthode que j'ai proposée: l'audio1 se lance, après 5s l'audio2 se lance mais l'audio1 se coupe (au contraire l'audio1 doit continuer sa lecture).
    Vous supposez que la bibliothèque va mélanger les sons expédiés au haut-parleur parce que c'est ce que vous voulez?
    Si elle se contente de faire tel que c'est documenté, c'est déjà pas si mal!

    Il faut ajouter un "mixer" (pour mélanger) et à priori vous avez la bibliothèque realtime audio mixer à ajouter (et à apprendre à utiliser).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 103
    Points : 4 449
    Points
    4 449
    Par défaut
    bonjour

    peut-être une autre solution très différente, serait de regarder une librairie de ce type ? Ici, existe overlay()
    $moi= ( !== ) ? : ;

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Vous supposez que la bibliothèque va mélanger les sons expédiés au haut-parleur parce que c'est ce que vous voulez?
    Si elle se contente de faire tel que c'est documenté, c'est déjà pas si mal!

    Il faut ajouter un "mixer" (pour mélanger) et à priori vous avez la bibliothèque realtime audio mixer à ajouter (et à apprendre à utiliser).

    - W
    Je suis pas sûre de comprendre votre question! Peut-être je me suis mal exprimée: j'ai deux haut parleurs séparés, branchés chacun sur des ports différents de mon pc. Mon but est d'envoyé audio1 à un des haut parleur et audio2 sur l'autre. Et mon problème ici est que je veux que le lancement de audio2 soit différé par exemple de 5s du lancement de audio1, audio1 doit tout de même continuer d'être lu quand audio2 se lance, ce que je n'obtiens pas avec le code ci dessous, audio1 se coupe quand audio2 se lance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    start_audio1()
    threading.Timer(5, start_audio2).start()
    Du coup je ne pense pas qu'un mixage soit necessaire, si?

  10. #10
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    This tutorial will explain different methods attempted in getting multiple sounds to play concurrently using python.
    Regarde le lien. Tu devrais y trouver ton bonheur.
    https://classes.engineering.wustl.ed...sounds_at_once
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  11. #11
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    peut-être une autre solution très différente, serait de regarder une librairie de ce type ? Ici, existe overlay()
    On peut rajouté un silence dans le fichier wav avec pydub: how-to-add-seconds-of-silence-at-the-end-of-a-wav-file, ça pourrait être une solution de créer un silence de quelques secondes en fonction du délai que je souhaite au début du fichier audio2. Qu'en pensez-vous?

    Par contre je n'ai pas l'impression que la segmentation dans le 2ème lien que vous proposez pourrait décaler l'audio2, j'avoue ne pas bien comprendre le programme donc je me trompe sûrement.

  12. #12
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2022
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    J'ai finalement réussi en ajoutant un silence de 5 secondes au début de mon 2ème audio. J'ai utiliser le lien https://stackoverflow.com/questions/...-of-a-wav-file

    Merci de votre aide !

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par rimalou Voir le message
    Et mon problème ici est que je veux que le lancement de audio2 soit différé par exemple de 5s du lancement de audio1, audio1 doit tout de même continuer d'être lu quand audio2 se lance, ce que je n'obtiens pas avec le code ci dessous, audio1 se coupe quand audio2 se lance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    start_audio1()
    threading.Timer(5, start_audio2).start()
    Du coup je ne pense pas qu'un mixage soit necessaire, si?
    Comme je n'ai ni le matériel, ni la configuration pour reproduire quoi que ce soit... vous avez certainement raison.
    Si on cherche un peu sur Internet, on trouve ceci expliquant le soucis venant de "play" (et que faire pour que ça marche).
    Mais je ne peux pas tester pour vous.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. attendre 1 seconde entre deux fonctions
    Par urousseau dans le forum C++Builder
    Réponses: 8
    Dernier message: 08/06/2008, 19h14
  2. Deux fonctions ds le "OnChange" !
    Par lecail65 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 25/01/2007, 22h05
  3. [MySQL] Conflit entre deux fonction WHILE
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/11/2006, 18h15
  4. lancer deux fonctions en même temps
    Par youp_db dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/09/2006, 12h11
  5. [Système] Imbriquer deux fonctions ?
    Par psychoBob dans le forum Langage
    Réponses: 4
    Dernier message: 22/04/2006, 20h49

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