Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Official Expo team skills for building, deploying, and debugging Expo apps — fine-tuned for Claude Code.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/expo-av-to-audio.md
1# Migrating from expo-av to expo-audio23## Imports45```tsx6// Before7import { Audio } from 'expo-av';89// After10import { useAudioPlayer, useAudioRecorder, RecordingPresets, AudioModule, setAudioModeAsync } from 'expo-audio';11```1213## Audio Playback1415### Before (expo-av)1617```tsx18const [sound, setSound] = useState<Audio.Sound>();1920async function playSound() {21const { sound } = await Audio.Sound.createAsync(require('./audio.mp3'));22setSound(sound);23await sound.playAsync();24}2526useEffect(() => {27return sound ? () => { sound.unloadAsync(); } : undefined;28}, [sound]);29```3031### After (expo-audio)3233```tsx34const player = useAudioPlayer(require('./audio.mp3'));3536// Play37player.play();38```3940## Audio Recording4142### Before (expo-av)4344```tsx45const [recording, setRecording] = useState<Audio.Recording>();4647async function startRecording() {48await Audio.requestPermissionsAsync();49await Audio.setAudioModeAsync({ allowsRecordingIOS: true, playsInSilentModeIOS: true });50const { recording } = await Audio.Recording.createAsync(Audio.RecordingOptionsPresets.HIGH_QUALITY);51setRecording(recording);52}5354async function stopRecording() {55await recording?.stopAndUnloadAsync();56const uri = recording?.getURI();57}58```5960### After (expo-audio)6162```tsx63const recorder = useAudioRecorder(RecordingPresets.HIGH_QUALITY);6465async function startRecording() {66await AudioModule.requestRecordingPermissionsAsync();67await recorder.prepareToRecordAsync();68recorder.record();69}7071async function stopRecording() {72await recorder.stop();73const uri = recorder.uri;74}75```7677## Audio Mode7879### Before (expo-av)8081```tsx82await Audio.setAudioModeAsync({83allowsRecordingIOS: true,84playsInSilentModeIOS: true,85staysActiveInBackground: true,86interruptionModeIOS: InterruptionModeIOS.DoNotMix,87});88```8990### After (expo-audio)9192```tsx93await setAudioModeAsync({94playsInSilentMode: true,95shouldPlayInBackground: true,96interruptionMode: 'doNotMix',97});98```99100## API Mapping101102| expo-av | expo-audio |103|---------|------------|104| `Audio.Sound.createAsync()` | `useAudioPlayer(source)` |105| `sound.playAsync()` | `player.play()` |106| `sound.pauseAsync()` | `player.pause()` |107| `sound.setPositionAsync(ms)` | `player.seekTo(seconds)` |108| `sound.setVolumeAsync(vol)` | `player.volume = vol` |109| `sound.setRateAsync(rate)` | `player.playbackRate = rate` |110| `sound.setIsLoopingAsync(loop)` | `player.loop = loop` |111| `sound.unloadAsync()` | Automatic via hook |112| `playbackStatus.positionMillis` | `player.currentTime` (seconds) |113| `playbackStatus.durationMillis` | `player.duration` (seconds) |114| `playbackStatus.isPlaying` | `player.playing` |115| `Audio.Recording.createAsync()` | `useAudioRecorder(preset)` |116| `Audio.RecordingOptionsPresets.*` | `RecordingPresets.*` |117| `recording.stopAndUnloadAsync()` | `recorder.stop()` |118| `recording.getURI()` | `recorder.uri` |119| `Audio.requestPermissionsAsync()` | `AudioModule.requestRecordingPermissionsAsync()` |120121## Key Differences122123- **No auto-reset on finish**: After `play()` completes, the player stays paused at the end. To replay, call `player.seekTo(0)` then `play()`124- **Time in seconds**: expo-audio uses seconds, not milliseconds (matching web standards)125- **Immediate loading**: Audio loads immediately when the hook mounts—no explicit preloading needed126- **Automatic cleanup**: No need to call `unloadAsync()`, hooks handle resource cleanup on unmount127- **Multiple players**: Create multiple `useAudioPlayer` instances and store them—all load immediately128- **Direct property access**: Set volume, rate, loop directly on the player object (`player.volume = 0.5`)129130## API Reference131132https://docs.expo.dev/versions/latest/sdk/audio/133