android-media
A Rust-based Android media library that provides simple and easy-to-use audio recording and playback functionality.
中文文档 | English
Features
- 🎤 Audio Recording - Support for microphone recording with asynchronous audio data reading
- 🔊 Audio Playback - Support for both streaming and static playback modes
- 🎯 Type Safety - Enum-based constants provide type-safe APIs
- ⚡ Async Support - Tokio-based async APIs to avoid blocking the main thread
- 🔄 JNI Integration - Seamless integration with native Android AudioRecord and AudioTrack
- 📦 Zero Dependencies - No third-party dependencies except required JNI and Tokio
Quick Start
Install Dependencies
First, install cargo-apk2, a tool for building Android APKs:
Then add android-media to your project:
Run Example
Usage Examples
Audio Recording
use ;
// Create microphone instance
let mic = new?;
// Start recording
mic.start?;
// Read 3 seconds of audio data
let audio_data = mic.read.await?;
// Stop recording
mic.stop?;
Audio Playback
use ;
// Create player instance
let player = new?;
// Start playback
player.play?;
// Write audio data
player.write.await?;
// Stop playback
player.stop?;
Record and Play
async
API Documentation
Audio Constants
SampleRate
Audio sample rate enumeration supporting standard sample rates:
Rate8000- 8000 Hz, commonly used for speech recognitionRate16000- 16000 Hz, standard for voice applicationsRate22050- 22050 HzRate44100- 44100 Hz, CD audio standardRate48000- 48000 Hz, professional audio standard
use SampleRate;
let rate = Rate16000;
assert_eq!;
AudioEncoding
Audio encoding format enumeration:
Pcm8bit- 8-bit PCM encodingPcm16bit- 16-bit PCM encoding (most common)PcmFloat- 32-bit float PCM encoding
use AudioEncoding;
let encoding = Pcm16bit;
assert_eq!;
assert_eq!;
ChannelInConfig / ChannelOutConfig
Audio channel configuration:
Mono- Single channel (mono)Stereo- Two channels (stereo)
use ChannelInConfig;
let config = Mono;
assert_eq!;
assert_eq!;
AudioSource
Audio source type:
Default- Default audio sourceMic- Main microphoneCamcorder- Camera audioVoiceRecognition- Voice recognition (with noise suppression)VoiceCommunication- Voice communication (with echo cancellation)
PlayerMode
Player mode:
Static- Static mode, suitable for short audio clipsStream- Stream mode, suitable for long audio and real-time streams
AudioMicrophone
Rust wrapper for microphone recording.
Methods
new()- Create a new microphone instancestart()- Start recordingstop()- Stop recordingread(duration_ms)- Asynchronously read audio data for a specified durationrelease()- Release resourcesget_sample_rate()- Get sample rateget_channel_count()- Get channel countget_audio_format()- Get audio formatget_buffer_size()- Get buffer sizecalculate_bytes_for_duration(duration_ms)- Calculate bytes for a specified duration
AudioPlayer
Rust wrapper for audio playback.
Methods
new()- Create a new player instanceplay()- Start playbackstop()- Stop playbackpause()- Pause playbackflush()- Flush bufferrelease()- Release resourceswrite(audio_data)- Asynchronously write audio dataget_sample_rate()- Get sample rateget_channel_count()- Get channel countget_audio_format()- Get audio formatget_mode()- Get playback modeget_buffer_size()- Get buffer size
Permissions
To use audio recording functionality, add microphone permission to AndroidManifest.xml:
[[]]
= "android.permission.RECORD_AUDIO"
For dynamic permission requests in your activity, see the example implementation in example/src/MainActivity.java.
Platform Support
- Android API 23+ (Android 6.0 Marshmallow and above)
Development Environment
- Rust 2024 Edition
- Android NDK
- cargo-apk2
License
Apache License 2.0
Author's Projects
- Compo - Core declarative reactive component framework
- Compo Platform Loop - Cross-platform event loop implementation
- Compo Window - Compo window component
- cargo-apk2 - Build Android applications with Cargo
Contributing
Issues and Pull Requests are welcome!