Streaming audio bugs

Questions à propos de la partie audio, y compris les problèmes de script s'y rapportant.
Répondre
Benoitlub
Messages : 6
Inscription : 07 Mars 2016 10:30

Streaming audio bugs

Message par Benoitlub » 13 Mars 2016 20:01

Bonjour, je suis infographiste depuis 20 ans et j'adore unity depuis que je l'ai découvert.
J'ai un projet qui fait appelle au streaming audio mais je bloque depuis des semaines et je n'ai pas trouvé la réponse sur le forum.

Le streaming peut fonctionner mais j'ai des bugs et je ne maîtrise pas du tout le c#
Dans mon code je ne comprends pas l'ordre de lecture.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class GetStream : MonoBehaviour {
	
	AudioClip clipa;
	bool played;
	WWW www;
	float timer;
	
	public string url = "http://###################/listen2.mp3";
	private int interval = 5;
	
	void Start(){
		Debug.Log("depart");
		clipa=null;
		played = false;
		timer=0;
		
	}
	
	void Update() {
		//Debug.Log(timer);
		
		timer = timer+1*Time.deltaTime; 
		
		if(timer>=interval){
			if(www != null){
				http://www.Dispose();
				Debug.Log(this+"youhou");
				www=null;
				played = false;
				timer= 0;
				interval = 10;

			}
		}else{

			if(www == null){
				Debug.Log(this+"loading");
				www = new WWW(url);
				interval = 20;
				timer= 0;
				//GetComponent<AudioSource>().Stop();
			}
		}
		if(clipa==null){
			if(www != null){
				clipa =www.GetAudioClip(false,true);

			}
		}
		
		if( clipa != null ){

			
			if( clipa.isReadyToPlay && played == false ){
			
					GetComponent<AudioSource>().PlayOneShot(clipa);
			
				played = true;
				clipa=null;
				interval = 60;

			}
		}
	}
}
Balises codes SVP ( </> )


Quelques inconvénients :
La méthode isReadyToPlay est annoncée comme obsolète mais quand je remplace par loadState ça ne marche plus, et je ne sais pas comment cette fonction doit être renseignée.
Le streaming commence bien après l'intervalle mais recommence par dessus le premier puis le premier s'arrête. Comme il y a une intro, elle se répète aussi après chaque intervalle.
Quand je veux mettre un yield le void start() ne marche plus et je dois changer pour ienumerator start() (?)
Je ne sais où mettre un while mais je sais qu'il le faut
La méthode play() ne donne pas de son.
Je ne sais pas pourquoi playOneShot fonctionne.

Voilà quelques questions qui je le pense mérite que plusieurs cerveaux se penchent dessus.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Streaming audio bugs

Message par Moi 1971 » 13 Mars 2016 21:40

Bonjour,
Plein de question, je ne pourrais répondre à toutes. Pour ton problème de " clipa.isReadyToPlay remplacé par "AudioDataLoadState" :
"AudioDataLoadState" est une fonction qui renvoie l'état actuel de ton audio clip. Les états possibles sont :
Unloaded
Loading
Loaded
Failed
Donc toi normalement tu dois tester si "AudioDataLoadState" renvoie la valeur "Loaded" Bon, je ne connais pas la syntaxe du code exacte, mais ça devrait ressembler à un truc du genre :

Code : Tout sélectionner

if( clipa.LoadState == AudioDataLoadState.Loaded && played == false ){
Peux-tu nous monter ton code concernant cette partie?

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Streaming audio bugs

Message par Moi 1971 » 13 Mars 2016 21:49

Pour ton problème de timer, peux-tu mettre ce code et nous dire ce qui s'affiche dans la console ( surtout les valeurs de "timer" )

Code : Tout sélectionner

 Debug.Log("Avant Timer : timer = "+timer+" interval =  "+interval);
if(timer>=interval){
         if(www != null){
            http://www.Dispose();
            Debug.Log(this+"youhou");

Benoitlub
Messages : 6
Inscription : 07 Mars 2016 10:30

Re: Streaming audio bugs

Message par Benoitlub » 13 Mars 2016 23:44

Code : Tout sélectionner

void Start(){
		Debug.Log("depart");
		clipa=null;
		played = false;
		timer=0;
		
	}
	
	void Update() {
		//Debug.Log(timer);
		Debug.Log ("avant Timer : timer = " + timer + " interval =" + interval);
		timer = timer + 1 * Time.deltaTime; 
		
		if (timer >= interval) {             
			if (www != null) {
				http://www.Dispose ();
				Debug.Log ("youhou");
				www = null;
				played = false;
				timer = 0;
				interval = 23;
				
			}
		} else {
			
			if (www == null) {
				Debug.Log ("loading et stop");
				www = new WWW (url);
				while (clipa.loadState == AudioDataLoadState.Loaded==false) {
					GetComponent<AudioSource> ().Stop ();
				}
			}
		}
	
		if(clipa==null){
			if(www != null){
				clipa = http://www.GetAudioClip(true,true);
				
			}
		}
		
		if( clipa != null ){
						
			if( clipa.loadState == AudioDataLoadState.Loaded && played==false ){
				
				GetComponent<AudioSource>().PlayOneShot(clipa);
			GetComponent<AudioSource>().name = url;
				played = true;
				clipa=null;
								
			}
		}
	}
}
apres quelques retouches
en ajoutant un stop sur le loading ça ne se chevauche plus mais la boucle dure 23 sec et c'est court

Benoitlub
Messages : 6
Inscription : 07 Mars 2016 10:30

Re: Streaming audio bugs

Message par Benoitlub » 13 Mars 2016 23:46

Code : Tout sélectionner

void Start(){
		Debug.Log("depart");
		clipa=null;
		played = false;
		timer=0;
		
	}
	
	void Update() {
		//Debug.Log(timer);
		Debug.Log ("avant Timer : timer = " + timer + " interval =" + interval);
		timer = timer + 1 * Time.deltaTime; 
		
		if (timer >= interval) {             
			if (www != null) {
				www.Dispose ();
				Debug.Log ("youhou");
				www = null;
				played = false;
				timer = 0;
				interval = 23;
				
			}
		} else {
			
			if (www == null) {
				Debug.Log ("loading et stop");
				www = new WWW (url);
				while (clipa.loadState == AudioDataLoadState.Loaded==false) {
					GetComponent<AudioSource> ().Stop ();
				}
			}
		}
	
		if(clipa==null){
			if(www != null){
				clipa = www.GetAudioClip(true,true);
				
			}
		}
		
		if( clipa != null ){
						
			if( clipa.loadState == AudioDataLoadState.Loaded && played==false ){
				
				GetComponent<AudioSource>().PlayOneShot(clipa);
			GetComponent<AudioSource>().name = url;
				played = true;
				clipa=null;
								
			}
		}
	}
}
apres quelques retouches
en ajoutant un stop sur le loading ça ne se chevauche plus mais la boucle dure 23 sec et c'est court

je n'ai pas tester sur android mais je vous dirais ça :hello:

Benoitlub
Messages : 6
Inscription : 07 Mars 2016 10:30

Re: Streaming audio bugs

Message par Benoitlub » 14 Mars 2016 20:12

Est ce que quelqu'un pourrait m'expliquer ou mettre une boucle avec while, avec mon interval actuel le son charge 5 secondes au démarrage, puis attends 23 secondes avant de relancer le streaming. Je suis sur de pouvoir faire autrement et quand on y pense ça ne ressemble pas à du streaming si unity ne peux jouer que quelques secondes preloader. C'est peut-être pour ça que le play() ne marche pas.
Je réfléchi...

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Streaming audio bugs

Message par Moi 1971 » 14 Mars 2016 20:34

Bonjour,
Je ne comprend pas pourquoi tu fais un timer pour lire un clip?

Benoitlub
Messages : 6
Inscription : 07 Mars 2016 10:30

Re: Streaming audio bugs

Message par Benoitlub » 14 Mars 2016 22:11

Il me semble que sans l'intervalle je n'avais rien qui se chargeait, maintenant comme j'ai expliqué plus haut je suis graphiste, je m'intéresse à la programmation mais mon cerveau ne veux pas s'y mettre. Souvent les bases de la programmation me manque et je rêve de percuter un jour.
Si tu as une formule qui marche autrement, je ne suis pas sectaire.
Le problème c'est que je bidouille des morceaux de codes trouvé par ci par là mais que je suis incapable de programmer from scratch.
Même si souvent mes attentes sont trop techniques pour des débutants, je le suis aussi, mais depuis 20 ans.

Benoitlub
Messages : 6
Inscription : 07 Mars 2016 10:30

Re: Streaming audio bugs

Message par Benoitlub » 14 Mars 2016 22:30

Avec le code actuel, si je retire la partie qui vérifie le temps et l'intervalle je dois pouvoir quand même bouclé jusqu'au lancement.
En ajoutant quoi?
Est que la fonction update ne joue pas déjà ce rôle?

Et j'ai ajouter une ligne pour que l'URL s'écrive comme source de audioclip mais je n'ai pas trouvé la fonction. Pour l'instant c'est le nom du gameobject qui change pendant la lecture, intéressant mais inutile pour le moment.
Et puis j'ai un autre script qui récupère des données JSON que j'affiche via un guiText, est ce que j'ai intérêt à garder mes scripts séparer ou plutôt à les réunirs ?

Dans le projet final j'aurais 6 ou 7 URLs à utilisée de même pour la partie JSON. Je n'en suis pas là mais ça influera forcément sur la programmation, et j'y pense déjà.
Une URL pour le flux et une pour le JSON du flux, wouhou c'est la fête.
C'est coton en fait, je réalise à l'instant

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Streaming audio bugs

Message par Moi 1971 » 15 Mars 2016 10:42

Benoitlub a écrit :..C'est coton en fait, je réalise à l'instant
Moi c'est le monde de la musique qui m'est inconnu. Tu es graphiste mais tu dois avoir de bonnes notions dedans car tu utilises des mots que je sais exister, mais dont je ne comprend pas le sens... :-D
Alors...
Avec le code actuel, si je retire la partie qui vérifie le temps et l'intervalle je dois pouvoir quand même bouclé jusqu'au lancement.
Il va falloir, pour moi en tout cas, utiliser plus de mots pour expliquer ce que tu veux. Le temps et l'intervalle?? les vérifier?? Bouclé jusqu'au lancement??? .. je comprends rien. Mais je suis nul en musique!! J'espère que d'autres plus calés vont venir ici...
Ce que j'ai compris, c'est que tu veux lire un clip provenant de quelque part.

Le clip tu le déclares:

Code : Tout sélectionner

 public AudioClip clipa;
J'ai rajouté "public" qui défini le mode d'accès que le "monde extérieur" à sur clipa. Ici, "public" veut dire que tout le monde y accède.
(mais tu pourrais mettre private, mais pour l'instant ça ira comme ça)

En suite le clip tu le renseignes :

Code : Tout sélectionner

clipa =www.GetAudioClip(false,true);
Comme expliqué ici, http://docs.unity3d.com/ScriptReference ... oClip.html
C'est un clip en 2D et la lecture commence avant que le clip ne soit complètement chargé.

Et enfin le clip tu le lis :

Code : Tout sélectionner

GetComponent<AudioSource>().PlayOneShot(clipa);
A quoi fonctionnellement sert le reste de ton code? que veux tu faire dans les faits? peux-tu exprimer tes attentes?

==================================

Sinon, il y a un problème d'optimisation. Tu ne devrais pas faire un GetComponent plus d'une fois dans ton script, si, comme ici, c'est le cas, tu devrais déclarer un audioSource et faire un "getComponent" une seul fois dans la fonction "Awake()"

Exemple de code :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class GetStream : MonoBehaviour {
   
   public AudioClip clipa;
   
   private AudioSource sourceDuSon;
   
   
   void Awake(){
   	sourceDuSon = GetComponent<AudioSource>();
   }
   
   ...
   ..
   .
   }
En suite dans tout le reste du code tu remplaces "GetComponent<AudioSource>()" par "sourceDuSon"
Exemple :

Code : Tout sélectionner

GetComponent<AudioSource>().PlayOneShot(clipa);
Donnerais :

Code : Tout sélectionner

sourceDuSon.PlayOneShot(clipa);

Répondre

Revenir vers « Audio, musique et sons »