React Native module for playing sound clips on iOS, Android, and Windows
npm install react-native-sound![npm version][npm]
![license][npm]
![downloads][npm]


[npm]: https://www.npmjs.com/package/react-native-sound
> ๐ Cross-platform audio playback for React Native โ Play sound clips on iOS and Android with full TypeScript support and modern React Native architecture compatibility.
- ๐ฏ Cross-platform: Works on iOS and Android
- ๐ฑ Modern Architecture: Full support for React Native's New Architecture (TurboModules)
- ๐ค TypeScript: Complete TypeScript definitions included
- ๐๏ธ Rich Controls: Play, pause, stop, seek, volume, pan, and looping
- ๐ Flexible Loading: Load from app bundle, local files, or network URLs
- ๐ Multiple Players: Play multiple sounds simultaneously
- โก Optimized: Minimal latency with preloading support
- ๐ก๏ธ Reliable: Battle-tested in production apps
> ๐ Note: This library focuses on audio clips playback, not streaming. For streaming audio, consider react-native-video or other dedicated streaming solutions.
iOS Implementation: Uses AVAudioPlayer for optimal performance and compatibility.
Android Implementation: Uses MediaPlayer with proper audio focus handling.
| Feature | iOS | Android |
| ---------------------------- | --- | ------- |
| Loading |
| Load from app bundle | โ
| โ
|
| Load from local files | โ
| โ
|
| Load from network URLs | โ
| โ
|
| Playback |
| Play/Pause/Stop | โ
| โ
|
| Playback completion callback | โ
| โ
|
| Resume playback | โ
| โ
|
| Reset to beginning | โ | โ
|
| Audio Control |
| Volume control | โ
| โ
|
| Pan (L/R stereo) | โ
| โ |
| Playback speed | โ
| โ
|
| System Integration |
| Get system volume | โ
| โ
|
| Set system volume | โ | โ
|
| Advanced Features |
| Loop control | โ
| โ
|
| Exact loop count | โ
| โ |
| Seek to time position | โ
| โ
|
| Get current position | โ
| โ
|
| Get duration | โ
| โ
|
| Get channel count | โ
| โ |
| Resource Management |
| Explicit resource cleanup | โ
| โ
|
``bash`
npm install react-native-sound
`bash`
yarn add react-native-sound
This library supports both the old and new React Native architecture:
- โ
Old Architecture: Uses traditional NativeModules
- โ
New Architecture: Uses TurboModules for better performance
- โ
Expo: Compatible with custom development builds (not Expo Go)
#### undefined is not an object (evaluating 'RNSound.IsAndroid')
This usually indicates a linking issue. Try:
1. Clear build cache:
`bash`
cd android && ./gradlew cleanBuildCache
2. Reset Metro cache:
`bash`
npx react-native start --reset-cache
3. Clean and rebuild:
`bash
# iOS
cd ios && rm -rf build && cd .. && npx react-native run-ios
# Android
cd android && ./gradlew clean && cd .. && npx react-native run-android
`
#### iOS Build Issues
- Ensure audio files are added to Xcode project bundle
- Check that AVFoundation framework is linked (automatically handled by CocoaPods)
#### Android Build Issues
- Place audio files in android/app/src/main/res/raw/
- Use lowercase filenames without spaces or special characters
- Clear build cache if encountering linking issues
- ๐ Wiki Documentation
- ๐ Issue Tracker
- ๐ฌ Discussions
Check out our enhanced example app with both remote and local audio playback:
- ๐ /example - Full-featured demo application
- ๐ฏ Remote URL audio playback
- ๐ฑ Local bundled audio files
- ๐จ Modern UI with TypeScript
- ๐ต react-native-sound-playerview - Advanced audio player UI component
#### Android
Save audio files in android/app/src/main/res/raw/:
``
android/app/src/main/res/raw/
โโโ whoosh.mp3 โ
Correct
โโโ button_click.wav โ
Correct
โโโ my-sound.mp3 โ Use underscores: my_sound.mp3
> Note: Use lowercase, underscored filenames. No subdirectories allowed.
#### iOS
1. Open your project in Xcode
2. Right-click your project โ "Add Files to [PROJECT]"
3. Select your audio files and ensure they're added to the app target
`typescript
import Sound from "react-native-sound";
// Enable playback in silence mode (important for iOS)
Sound.setCategory("Playback");
// Load a sound file from the app bundle
const whoosh = new Sound("whoosh.mp3", Sound.MAIN_BUNDLE, (error) => {
if (error) {
console.log("Failed to load the sound", error);
return;
}
// Sound loaded successfully
console.log("Duration:", whoosh.getDuration(), "seconds");
console.log("Channels:", whoosh.getNumberOfChannels());
// Play the sound
whoosh.play((success) => {
if (success) {
console.log("Successfully finished playing");
} else {
console.log("Playback failed due to audio decoding errors");
}
});
});
// Audio controls
whoosh.setVolume(0.5); // 50% volume
whoosh.setPan(1); // Full right stereo
whoosh.setNumberOfLoops(-1); // Loop indefinitely
// Get current properties
console.log("Volume:", whoosh.getVolume());
console.log("Pan:", whoosh.getPan());
console.log("Loops:", whoosh.getNumberOfLoops());
// Seek to specific time
whoosh.setCurrentTime(2.5);
// Get current playback position
whoosh.getCurrentTime((seconds) => {
console.log("Current time:", seconds);
});
// Control playback
whoosh.pause(); // Pause playback
whoosh.stop(() => {
// Stop and rewind
whoosh.play(); // Play from beginning
});
// Always release resources when done
whoosh.release();
`
#### Loading from Different Sources
`typescript
// From app bundle (most common)
const bundleSound = new Sound("sound.mp3", Sound.MAIN_BUNDLE, callback);
// From documents directory
const docSound = new Sound("sound.mp3", Sound.DOCUMENT, callback);
// From library directory
const libSound = new Sound("sound.mp3", Sound.LIBRARY, callback);
// From absolute path
const pathSound = new Sound("/path/to/sound.mp3", "", callback);
// From remote URL (iOS/Android only)
const urlSound = new Sound("https://example.com/sound.mp3", "", callback);
`
#### React Hook Example
`typescript
import { useEffect, useRef, useState } from "react";
import Sound from "react-native-sound";
const useSound = (filename: string) => {
const sound = useRef
const [isLoaded, setIsLoaded] = useState(false);
const [isPlaying, setIsPlaying] = useState(false);
useEffect(() => {
sound.current = new Sound(filename, Sound.MAIN_BUNDLE, (error) => {
if (error) {
console.log("Error loading sound:", error);
return;
}
setIsLoaded(true);
});
return () => {
sound.current?.release();
};
}, [filename]);
const play = () => {
if (sound.current && isLoaded) {
sound.current.play((success) => {
setIsPlaying(false);
});
setIsPlaying(true);
}
};
const stop = () => {
if (sound.current) {
sound.current.stop();
setIsPlaying(false);
}
};
return { play, stop, isLoaded, isPlaying };
};
`
- Preload sounds during app initialization to minimize playback delay
- Reuse Sound instances for multiple playbacks of the same file
- Avoid race conditions by ensuring sounds are loaded before calling play()
- iOS: Uses AVAudioSessionCategoryAmbient to mix multiple sounds
- Multiple playback: You can play several sound files simultaneously
- Background audio: Configure audio categories for background playback
#### iOS (AVAudioPlayer)
Supports: AAC, AIFF, CAF, MP3, WAV, and more
- ๐ Complete format list
#### Android (MediaPlayer)
Supports: 3GPP, MP4, MP3, AAC, OGG, FLAC, WAV, and more
- ๐ Complete format list
- Android absolute paths: Use /sdcard/ prefix (e.g., /sdcard/Downloads/sound.mp3)sound.setVolume(0.5).setPan(0.5).play()
- Method chaining: Supported for setters (e.g., )
| Library | Purpose | Best For |
| -------------------------------------------------------------------------------------------------------- | ----------------------- | ---------------------------- |
| react-native-video | Video & audio streaming | Streaming audio/video |
| react-native-audio-toolkit | Advanced audio features | Recording & complex audio |
| Expo Audio | Expo audio solution | Expo managed workflow |
| @react-native-async-storage/async-storage | Storage | Persisting audio preferences |
- โ
Playing sound effects and short audio clips
- โ
Background music with simple controls
- โ
Audio feedback for user interactions
- โ
Cross-platform compatibility requirements
- โ
TypeScript projects requiring type safety
- โ Audio streaming or long-form content
- โ Advanced audio processing or effects
- โ Audio recording capabilities
- โ Complex playlist management
We welcome contributions! Here's how you can help:
- ๐ Bug fixes and stability improvements
- ๐ Documentation improvements and examples
- ๐งช Test coverage expansion
- ๐ Performance optimizations
- ๐ New platform support
1. Fork and clone the repository
2. Install dependencies: npm installcd example && npm install && npm run android
3. Run the example app:
4. Make your changes and test thoroughly
5. Add tests for new features
6. Update documentation as needed
- ๐ Open an issue first for major changes to discuss the approach
- โ
Include tests for new functionality
- ๐ Update documentation including TypeScript definitions
- ๐งช Test on multiple platforms (iOS and Android)
- ๐ฑ Test with both architectures (old and new React Native architecture)
- Follow existing TypeScript/JavaScript patterns
- Use meaningful commit messages
- Keep changes focused and atomic
- To minimize playback delay, you may want to preload a sound file without calling play() (e.g. var s = new Sound(...);) during app initialization. This also helps avoid a race condition where play() may be called before loading of the sound is complete, which results in no sound but no error because loading is still being processed.AVAudioSessionCategoryAmbient
- You can play multiple sound files at the same time. Under the hood, this module uses to mix sounds on iOS.Sound
- You may reuse a instance for multiple playbacks.AVAudioPlayer
- On iOS, the module wraps that supports aac, aiff, mp3, wav etc. The full list of supported formats can be found at https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/CoreAudioOverview/SupportedAudioFormatsMacOSX/SupportedAudioFormatsMacOSX.htmlandroid.media.MediaPlayer
- On Android, the module wraps . The full list of supported formats can be found at https://developer.android.com/guide/topics/media/media-formats.htmlsound.setVolume(.5).setPan(.5).play()`.
- On Android, the absolute path can start with '/sdcard/'. So, if you want to access a sound called "my_sound.mp3" on Downloads folder, the absolute path will be: '/sdcard/Downloads/my_sound.mp3'.
- You may chain non-getter calls, for example,
MIT License - see LICENSE file for details.
If this library helps your project, consider:
- โญ Starring the repository
- ๐ Reporting bugs and issues
- ๐ Contributing improvements
- ๐ฌ Helping others in discussions
- ๐ข Sharing with the community
---
Made with โค๏ธ by the React Native community
