# Streaming de audio

Puedes reproducir audio en streaming desde una URL. Esto es útil para reproducir música directamente desde una radio por internet, o transmitir una conferencia dentro de tu escena.

{% hint style="info" %}
**💡 Tip**: En el [Scene Editor in Creator Hub](https://docs.decentraland.org/creator/content-creator-es/scene-editor/primeros-pasos/about-editor), puedes usar un **Transmisión de audio** [Smart Item](https://docs.decentraland.org/creator/content-creator-es/scene-editor/interactividad/smart-items) para una forma sin código de lograr esto.
{% endhint %}

El audio en la fuente debe estar en uno de los siguientes formatos: `.mp3`, `ogg`, o `aac`. La fuente también debe ser un *https* URL (*http* No se admiten URLs), y la fuente debería tener [políticas CORS (Cross Origin Resource Sharing)](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) que permitan acceder externamente a ella. Si este no es el caso, es posible que necesites configurar un servidor que actúe como proxy y exponga la transmisión de una manera válida.

{% hint style="warning" %}
**📔 Nota**: Para en su lugar reproducir un sonido pregrabado en tu escena, consulta [Sounds](https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/conceptos-esenciales-de-contenido-3d/sounds).
{% endhint %}

Para agregar una transmisión de audio a tu escena, simplemente agrega un `AudioStream` componente a una entidad:

```ts
const streamEntity = engine.addEntity()

AudioStream.create(streamEntity, {
	url: 'https://icecast.ravepartyradio.org/ravepartyradio-192.mp3',
	playing: true,
	volume: 0.8,
})
```

{% hint style="warning" %}
**📔 Nota**: El sonido transmitido no es posicional; se escuchará a un volumen consistente en toda tu escena. Si un jugador sale de la escena, no escuchará la transmisión en absoluto.
{% endhint %}

Establece el volumen del `AudioStream` componente cambiando su `volume` propiedad.

Activa o desactiva el `AudioStream` componente estableciendo su `playing` propiedad a *true* o *false*.

{% hint style="info" %}
**📔 Nota**: No todos los servicios de streaming permiten reproducir su audio fuera de su sitio. A continuación hay algunos ejemplos que funcionan en Decentraland:

```ts
DELTA = "https://cdn.instream.audio/:9069/stream?_=171cd6c2b6e"
GRAFFITI = "https://n07.radiojar.com/2qm1fc5kb.m4a?1617129761=&rj-tok=AAABeIR7VqwAilDFeUM39SDjmw&rj-ttl=5"
ISLA NEGRA = "https://radioislanegra.org/listen/up/basic.aac"
```

{% endhint %}

## Estado de la transmisión

Consulta el estado de una transmisión de audio usando la función `AudioStream.getAudioState()`, pasando la entidad que posee el `AudioStream` component.

El estado devuelto es un valor del `MediaState` enum. Este enum tiene los siguientes valores posibles:

* `MS_BUFFERING`
* `MS_ERROR`
* `MS_LOADING`
* `MS_NONE`
* `MS_PAUSED`
* `MS_PLAYING`
* `MS_READY`
* `MS_SEEKING`

El siguiente ejemplo verifica el estado de una transmisión y registra cuando hay un cambio.

```ts
export function main() {
	const entity = engine.addEntity()

	AudioStream.create(entity, {
		playing: true,
		volume: 1,
		url: 'https://audio-edge-es6pf.mia.g.radiomast.io/ref-128k-mp3-stereo',
	})

	let lastState: ReturnType<typeof AudioStream.getAudioState> = undefined
	engine.addSystem(() => {
		const currentState = AudioStream.getAudioState(entity)
		if (lastState !== currentState) {
			console.log('Stream state: ', currentState)

			if (currentState == MediaState.MS_ERROR) {
				// Intentar reconexión
			}
		}
	})
}
```

## Audio espacial

Por defecto, el audio de una `AudioStream` componente es global, lo que significa que se escuchará a un volumen consistente en toda tu escena. Si un jugador sale de la escena, no escuchará la transmisión en absoluto.

Para hacer el audio espacial, establece el `spatial` propiedad a *true*.

```ts
AudioStream.create(entity, {
	url: 'https://radioislanegra.org/listen/up/stream',
    playing: true,
	spatial: true,
})
```

El audio ahora se escuchará desde la posición de la entidad que posee el `AudioStream` componente, y será más fuerte a medida que el jugador se acerque.

Controla el audio espacial con las siguientes propiedades:

* `spatialMinDistance`: La distancia mínima a la que el audio se vuelve espacial. Si el jugador está más cerca, el audio se escuchará a volumen completo. *0* por defecto.
* `spatialMaxDistance`: La distancia máxima a la que se escucha el audio. Si el jugador está más lejos, el audio se escuchará a volumen 0. *60* por defecto

```ts
const audioStreamEntity = engine.addEntity();

Transform.create(audioStreamEntity, {
    position: Vector3.create(8, 0, 8),
});

AudioStream.create(audioStreamEntity, {
    url: 'https://radioislanegra.org/listen/up/stream',
    playing: true,
    volume: 1.0,
    spatial: true,
    spatialMinDistance: 5,
    spatialMaxDistance: 10
});
```

{% hint style="warning" %}
**📔 Nota**: Algunos formatos de audio no son compatibles con audio espacial. Asegúrate de que el audio de la transmisión esté codificado en *mp3*, *AAC-LC* o *FLAC*.
{% endhint %}
