# Streaming de áudio

Você pode transmitir áudio a partir de uma URL. Isso é útil para reproduzir música diretamente de uma rádio na internet ou transmitir uma conferência para a sua scene.

{% hint style="info" %}
**💡 Dica**: No [Scene Editor no Creator Hub](/creator/content-creator-pt/scene-editor/comecar/about-editor.md), você pode usar um **Audio Stream** [Smart Item](/creator/content-creator-pt/scene-editor/interatividade/smart-items.md) para uma forma sem código de conseguir isso.
{% endhint %}

O áudio na origem deve estar em um dos seguintes formatos: `.mp3`, `ogg`, ou `aac`. A origem também deve ser uma *https* URL (*http* URLs não são compatíveis), e a origem deve ter [políticas CORS (Cross Origin Resource Sharing)](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) que permitam o acesso externo. Se esse não for o caso, talvez seja necessário configurar um server para atuar como proxy e expor o stream de uma forma válida.

{% hint style="warning" %}
**📔 Nota**: Para reproduzir em vez disso um som pré-gravado na sua scene, veja [Sounds](/creator/content-creator-pt/scenes-sdk7/essenciais-de-conteudo-3d/sounds.md).
{% endhint %}

Para adicionar um audio stream na sua scene, basta adicionar um `AudioStream` component a uma entity:

```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**: O som transmitido não é posicional; ele será ouvido com um volume consistente em toda a sua scene. Se um player sair da scene, ele não ouvirá o stream de forma alguma.
{% endhint %}

Defina o volume do `AudioStream` component alterando sua `volume` property.

Ative ou desative o `AudioStream` component definindo sua `playing` property como *true* ou *false*.

{% hint style="info" %}
**📔 Nota**: Nem todos os serviços de streaming permitem que você reproduza o áudio deles fora do site. A seguir estão alguns exemplos que funcionam no 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 do stream

Consulte o estado de um audio stream usando a função `AudioStream.getAudioState()`, passando a entity que possui o `AudioStream` component.

O estado retornado é um valor do `MediaState` enum. Este enum tem os seguintes valores possíveis:

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

O exemplo a seguir verifica o estado de um stream e registra logs quando houver uma mudança.

```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) {
				// Attempt reconnection
			}
		}
	})
}
```

## Áudio espacial

Por padrão, o áudio de um `AudioStream` component é global, o que significa que ele será ouvido com um volume consistente em toda a sua scene. Se um player sair da scene, ele não ouvirá o stream de forma alguma.

Para tornar o áudio espacial, defina o `spatial` property como *true*.

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

O áudio agora será ouvido a partir da posição da entity que possui o `AudioStream` component, e ficará mais alto conforme o player se aproximar dele.

Controle o áudio espacial com as seguintes properties:

* `spatialMinDistance`: A distância mínima na qual o áudio se torna espacial. Se o player estiver mais perto, o áudio será ouvido em volume máximo. *0* por padrão.
* `spatialMaxDistance`: A distância máxima na qual o áudio é ouvido. Se o player estiver mais longe, o áudio será ouvido com volume 0. *60* por padrão

```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**: Alguns formatos de áudio não suportam áudio espacial. Certifique-se de que o áudio do stream esteja codificado em *mp3*, *AAC-LC* ou *FLAC*.
{% endhint %}

## Análise de áudio

Você pode ler dados de amplitude e frequência em tempo real de uma `AudioStream` entity para acionar visuais reativos, como equalizadores ou luzes pulsantes no ritmo. Veja [Análise de áudio](/creator/content-creator-pt/scenes-sdk7/media/audio-analysis.md).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/media/audio-streaming.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
