Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Streaming de audio de la web

Iniciado por Braltor, Agosto 16, 2017, 01:30:43 AM

Tema anterior - Siguiente tema
Buenas! Alguien de casualidad ha logrado hacer streaming de un audio de la web? Quiero hacer un radio y estoy probando con http://streamer.radio.co/sbc877548e/listen Lo he logrado reproducir a medias, modificando un poco el ejemplo de la doc y ejecutando en Android donde el codec de MPEG está disponible:
 

public class Radio : MonoBehaviour
{
public string url;
public AudioSource source;
public AudioType audioType;
void Start()
{
   WWW www = new WWW(url);
   source = GetComponent<AudioSource>();
   source.loop = true;
   source.clip = www.GetAudioClip(false, true, audioType);
}
   
void Update()
{
   if (!source.isPlaying && source.clip && source.clip.isReadyToPlay)
      source.Play();
}
}

 
Sin el loop reproduce como 1 segundo, pense que poniendolo en loop continuaria descargando para hacer el streaming, pero solo hace loop de ese segundo de audio. Parece que hay que seguir descargando y reproduciendo, la cuestion es como hacerlo de la mejor manera para que se escuche sin pausas tomando en cuenta que la descarga no sera instantanea??
 
 
 
 

Agosto 16, 2017, 03:19:54 PM #1 Ultima modificación: Agosto 16, 2017, 03:20:55 PM por francoe1
El problema es que no esta descargando todo el audio. la class WWW se utiliza dentro de un enumerador, esto hace que se pueda descargar el archivo de manera "Asincrónica", para poder realizar esto deberias hacerlo de la siguiente manera.
 

private IEnumerator DownloadAudio(string url, Action<AudioClip> callback)
{
  WWW www = new WWW(url);
  yield return www; //Esperar que el motor de corrutine evalue que la clase WWW ha terminado con la descarga.
  if(!string.IsEmptyOrNull(url))
  {
     callback(null);     
  }
  else
  {
     callback(www.GetAudioClip(false, true, audioType));
  }
}

 
Para utilizarla.
 

private void Start()
{
StartCorrutine(DownloadAudio("http://www.mipagina.com/audio.mp3", OnPlayAudio));
}
private void OnPlayAudio(AudioClip ac)
{
if(ac == null)return;
audiosource.PlayOneShot(ac);
}

 
Ahora si dispondras del audio completo.

Agosto 16, 2017, 04:28:48 PM #2 Ultima modificación: Agosto 16, 2017, 04:33:22 PM por Braltor
Gracias @francoe1 pero justamente que no descargue todo el audio es lo que se necesita, que vaya reproduciendo fragmentos para poder hacer streaming. Probe tu codigo pero no reproduce.
 
Despues del post me puse a probar con corutinas como lo has hecho y ahora tengo esto que "funciona" (digamos):
 

public class Radio : MonoBehaviour
{
public string url = "http://streamer.radio.co/sbc877548e/listen";
public AudioType audioType = AudioType.MPEG;
public AudioSource source;
void Start()
{
   if (!source)
      source = GetComponent<AudioSource> ();
   StartCoroutine (StreamAudio());
}
IEnumerator StreamAudio()   // comienza reproduciendo bien pero luego se va atorando, fuga de memoria?
{
   var t = 0f;
   while (true) {
      var www = new WWW(url);
      var ac = www.GetAudioClip(false, true, audioType);
      while (t > 0 || !ac.isReadyToPlay) {
         yield return null;
         t -= Time.deltaTime;
      }
      t = 1.5f;//ac.length;   // no detecta el tamaño?
      if (source.clip)
         DestroyImmediate (source.clip);   // fuga de memoria?
      source.clip = ac;
      source.Play ();
   }
}
}

 
Va cargando y reproduciendo pero tiene un par de problemas:
 
1. Aunque no lo he depurado pareceria que no detecta el tamaño del clip en segundos, estoy adivinando con 1.5 segundos pero hace brincos y pausas porque no se sabe cuanto hay que esperar. AudioSource.isPlaying tampoco avisa cuando ha parado. Puedo intentar analizar los datos del clip y de alguna manera calcular la longitud con la frecuencia.
 
2. Despues de unos segundos las pausas se vuelven mas largas, como que hubiera un leak... tambien tengo que depurar y ver el profiler.
 
Pero antes de clavarme en esos problemas quiero ver si ya tienen un reproductor o saben una solucion mas facil.
 
Ademas de todo eso investigue un tanto mas y encontre que: el nuevo metodo para cargar un clip en Unity 2017 no soporta stream, hay un asset que hace lo quiero pero cuesta $40 y no quiero gastar https://www.assetstore.unity3d.com/en/#!/content/65411

...resulta que WWW y AudioClip se reusan a dar cualquier información util cuando se trata de streams, no hay numero de samples, ni progreso de la descarga. Entonces termine haciendo dos cargas desfasadas y mezclando los clips con un "equal power crossfade":
 

 
 
 
eso dio un buen resultado entoces doy esto por resuelto!! Hasta el proximo embrollo...

Etiquetas: