Loading...
Loading...
Add audio sources, sound effects, music, audio streaming, and video players to Decentraland scenes. Use when user wants sound, music, audio, video screens, speakers, or media playback.
npx skill4agent add dcl-regenesislabs/opendcl audio-videoimport { engine, Transform, AudioSource } from '@dcl/sdk/ecs'
import { Vector3 } from '@dcl/sdk/math'
const speaker = engine.addEntity()
Transform.create(speaker, { position: Vector3.create(8, 1, 8) })
AudioSource.create(speaker, {
audioClipUrl: 'sounds/music.mp3',
playing: true,
loop: true,
volume: 0.5, // 0 to 1
pitch: 1.0 // Playback speed (0.5 = half speed, 2.0 = double)
}).mp3.ogg.wavproject/
├── sounds/
│ ├── click.mp3
│ ├── background-music.mp3
│ └── explosion.ogg
├── src/
│ └── index.ts
└── scene.json// Play
AudioSource.getMutable(speaker).playing = true
// Stop
AudioSource.getMutable(speaker).playing = false
// Toggle
const audio = AudioSource.getMutable(speaker)
audio.playing = !audio.playingimport { pointerEventsSystem, InputAction } from '@dcl/sdk/ecs'
const button = engine.addEntity()
// ... set up transform and mesh ...
const audioEntity = engine.addEntity()
Transform.create(audioEntity, { position: Vector3.create(8, 1, 8) })
AudioSource.create(audioEntity, {
audioClipUrl: 'sounds/click.mp3',
playing: false,
loop: false,
volume: 0.8
})
pointerEventsSystem.onPointerDown(
{ entity: button, opts: { button: InputAction.IA_POINTER, hoverText: 'Play sound' } },
() => {
// Reset and play
const audio = AudioSource.getMutable(audioEntity)
audio.playing = false
audio.playing = true
}
)import { engine, Transform, AudioStream } from '@dcl/sdk/ecs'
import { Vector3 } from '@dcl/sdk/math'
const radio = engine.addEntity()
Transform.create(radio, { position: Vector3.create(8, 1, 8) })
AudioStream.create(radio, {
url: 'https://example.com/stream.mp3',
playing: true,
volume: 0.3
})import { engine, Transform, VideoPlayer, Material, MeshRenderer } from '@dcl/sdk/ecs'
import { Vector3 } from '@dcl/sdk/math'
// Create a screen
const screen = engine.addEntity()
Transform.create(screen, {
position: Vector3.create(8, 3, 15.9),
scale: Vector3.create(8, 4.5, 1) // 16:9 ratio
})
MeshRenderer.setPlane(screen)
// Add video player
VideoPlayer.create(screen, {
src: 'https://example.com/video.mp4',
playing: true,
loop: true,
volume: 0.5,
playbackRate: 1.0,
position: 0 // Start time in seconds
})
// Create video texture
const videoTexture = Material.Texture.Video({ videoPlayerEntity: screen })
// Basic material (recommended — better performance)
Material.setBasicMaterial(screen, {
texture: videoTexture
})// Play
VideoPlayer.getMutable(screen).playing = true
// Pause
VideoPlayer.getMutable(screen).playing = false
// Change volume
VideoPlayer.getMutable(screen).volume = 0.8
// Change source
VideoPlayer.getMutable(screen).src = 'https://example.com/other.mp4'import { Color3 } from '@dcl/sdk/math'
const videoTexture = Material.Texture.Video({ videoPlayerEntity: screen })
Material.setPbrMaterial(screen, {
texture: videoTexture,
roughness: 1.0,
specularIntensity: 0,
metallic: 0,
emissiveTexture: videoTexture,
emissiveIntensity: 0.6,
emissiveColor: Color3.White()
})import { videoEventsSystem, VideoState } from '@dcl/sdk/ecs'
videoEventsSystem.registerVideoEventsEntity(screen, (videoEvent) => {
switch (videoEvent.state) {
case VideoState.VS_PLAYING:
console.log('Video started playing')
break
case VideoState.VS_PAUSED:
console.log('Video paused')
break
case VideoState.VS_READY:
console.log('Video ready to play')
break
case VideoState.VS_ERROR:
console.log('Video error occurred')
break
}
})Transform{baseDir}/../../context/audio-catalog.md# Download from catalog
mkdir -p sounds
curl -o sounds/ambient_1.mp3 "https://builder-items.decentraland.org/contents/bafybeic4faewxkdqx67dloyw57ikgaeibc2e2dbx34hwjubl3gfvs2r4su"// Reference in code — must be a local file path
AudioSource.create(entity, { audioClipUrl: 'sounds/ambient_1.mp3', playing: true, loop: true })sounds/Important:only works with local files. Never use external URLs for theAudioSourcefield. Always download audio intoaudioClipUrlfirst.sounds/
import { videoEventsSystem, VideoState } from '@dcl/sdk/ecs'
engine.addSystem(() => {
const state = videoEventsSystem.getVideoState(videoEntity)
if (state) {
console.log('Video state:', state.state) // VideoState.VS_PLAYING, VS_PAUSED, etc.
console.log('Current time:', state.currentOffset)
}
})AudioEventimport { AudioEvent } from '@dcl/sdk/ecs'
engine.addSystem(() => {
const event = AudioEvent.getOrNull(audioEntity)
if (event) {
console.log('Audio state:', event.state) // playing, paused, finished
}
})ALLOW_MEDIA_HOSTNAMES{
"requiredPermissions": ["ALLOW_MEDIA_HOSTNAMES"],
"allowedMediaHostnames": ["stream.example.com", "cdn.example.com"]
}videoPlayerEntityMaterial.setPbrMaterial(screen1, {
texture: Material.Texture.Video({ videoPlayerEntity: videoEntity })
})
Material.setPbrMaterial(screen2, {
texture: Material.Texture.Video({ videoPlayerEntity: videoEntity })
}).mp4.webm.m3u8.m3u8.mp3.ogg