Lancement différé de deux fonctions

rimalou44 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
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

import sounddevice as sd
import soundfile as sf
import threading
import time

Son1= 'audio1.wav'
Son2= 'audio2.wav'

def audioFunc1():
    audio1 = 'audio1.wav'
    data1, fs1 = sf.read(audio1, dtype='float32')
    L1=[]
    for i in range(50):
        L1.append(data1[i])
    print(L1)
    sd.play(data1, fs1, device=5)   #enceinte 1 

def audioFunc2():
    audio2 = 'audio2.wav'
    data2, fs2 = sf.read(audio2, dtype='float32')
    L2=[]
    for i in range(50):
        L2.append(data2[i])
    print(L2)
    sd.play(data2, fs2, device=6)  #enceinte 2


#LECTURE AUDIOS

duration = len(sf.read(Son2)[0]) # duration of Son2

def start_audio1():
    threading.Thread(target = audioFunc1).start()

def start_audio2():
    while True: # infinite while-loop
        threading.Thread(target = audioFunc2).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()





Configuration: Windows / Chrome 100.0.4896.127

4 réponses

Utilisateur anonyme
 
Bonsoir

je t'invite à lire cet article concernant la bonne utilisation des balises de codes
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Je ne code pas en python (ou très peu) et je n'ai pas la réponse à ton problème.

Cela dit, dès le départ tu fais une erreur importante.
Le but premier d'une fonction c'est de ne pas écrire plusieurs fois un code qui sera utilisé plusieurs fois, pour
  • gagner du temps
  • dans une moindre mesure, gagner de la place (avec nos gigaoctet aujourd'hui bof...)
  • gagner en lisibilité
  • gagner en maintenance (y'a qu'un code à faire évoluer).


Le principe est celui ci, si 2 codes sont "quasiment" identiques et que ce qui change peut être une variable (ou des variables), alors on écrit une seule fonction avec les variables en paramètre.

Donc ça

Son1= 'audio1.wav'
Son2= 'audio2.wav'

def audioFunc1():
    audio1 = 'audio1.wav'
    data1, fs1 = sf.read(audio1, dtype='float32')
    L1=[]
    for i in range(50):
        L1.append(data1[i])
    print(L1)
    sd.play(data1, fs1, device=5)   #enceinte 1 

def audioFunc2():
    audio2 = 'audio2.wav'
    data2, fs2 = sf.read(audio2, dtype='float32')
    L2=[]
    for i in range(50):
        L2.append(data2[i])
    print(L2)
    sd.play(data2, fs2, device=6)  #enceinte 2

#...
audioFunc1()

#...
audioFunc2()


(T'as vu c'est mieux avec les balises correctement utlisées)

Doit être modifié pour ressembler à

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)  

#...
audioFunc(Son1, 5)
 
#...
audioFunc(Son2, 6)
0
rimalou44 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
D'accord merci, je n'ai pas encore le reflexe de synthétiser comme ca avec les fonctions, j'aime bien tout décomposer au début histoire de voir toutes les étapes et ensuite organiser le programme comme tu le propose, mais c'est surement une perte de temps et de clarté en effet !
0
rimalou44 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
#version corrigée du sujet

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

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()
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
bonjour,
à la ligne 34, le second paramètre doit être le nom de la fonction.
0
Utilisateur anonyme
 
Y’a une différence entre décomposer et faire 2 fois la même chose.

Décomposer c’est écrire sur plusieurs lignes simples, un code qui peut s’écrire sur une seule ligne (très) complexe.

Par exemple
L1=[]
    for i in range(50):
        L1.append(data1[i]) 

A mon avis, il existe une fonction python qui permet d’écrire ça sur une ligne, mais soit tu ne la connais pas (et moi non plus pour le coup) soit ça te parait plus clair ainsi.
Ça c’est de la décomposition

0