Audio recorder from microphone to a given file path or stream.
No external dependencies:
- On Android, AudioRecord and MediaCodec or MediaRecorder.
- On iOS and macOS, AVFoundation.
- On Windows, MediaFoundation.
- On web, well... your browser! (and its underlying platform).
External dependencies:
- On linux, encoding is provided by fmedia. It must be installed separately.
Platform feature parity matrix
Feature | Android | iOS | web | Windows | macOS | linux |
---|---|---|---|---|---|---|
pause/resume | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
amplitude(dBFS) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | |
permission check | ✔️ | ✔️ | ✔️ | ✔️ | ||
num of channels | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
device selection | ✔️ 1 / 2 | (auto BT/mic) | ✔️ | ✔️ | ✔️ | ✔️ |
auto gain | ✔️ 2 | (always active?) | ✔️ | |||
echo cancel | ✔️ 2 | ✔️ | ||||
noise suppresion | ✔️ 2 | ✔️ |
File
Encoder | Android | iOS | web | Windows | macOS | linux |
---|---|---|---|---|---|---|
aacLc | ✔️ | ✔️ | ? | ✔️ | ✔️ | ✔️ |
aacEld | ✔️ | ✔️ | ? | ✔️ | ||
aacHe | ✔️ | ? | ✔️ | |||
amrNb | ✔️ | ? | ✔️ | |||
amrWb | ✔️ | ? | ||||
opus | ✔️ | ✔️ 3 | ✔️ | |||
wav | ✔️ 2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
flac | ✔️ 2 | ✔️ | ? | ✔️ | ✔️ | ✔️ |
pcm16bits | ✔️ 2 | ✔️ | ✔️ | ✔️ | ✔️ |
- Question marks (?) in web column mean that the formats are supported by the plugin but are not available in current (and tested) browsers (Chrome / Firefox).
Stream
Encoder | Android | iOS | web | Windows | macOS | linux |
---|---|---|---|---|---|---|
aacLc * | ✔️ 2 | |||||
aacEld * | ✔️ 2 | |||||
aacHe * | ✔️ 2 | |||||
pcm16bits | ✔️ 2 | ✔️ | ✔️ | ✔️ | ✔️ |
* AAC is streamed with raw AAC with ADTS headers, so it's directly readable through a file!
- Bluetooth telephony device link (SCO) is automatically done but there's no phone call management.
- Unsupported on legacy Android recorder.
- Sample rate output is determined by your settings in OS. Bit depth is likely 32 bits.
Usage
import 'package:record/record.dart';
final record = AudioRecorder();
// Check and request permission if needed
if (await record.hasPermission()) {
// Start recording to file
await record.start(const RecordConfig(), path: 'aFullPath/myFile.m4a');
// ... or to stream
final stream = await record.startStream(const RecordConfig(AudioEncoder.pcm16bits));
}
// Stop recording...
final path = await record.stop();
// ... or cancel it (and implicitly remove file/blob).
await record.cancel();
record.dispose(); // As always, don't forget this one.
Setup, permissions and others
Android
Plugin targets API level 34 and uses Java 17. Follow Gradle setup if needed.
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- Optional: Add this permission if you want to use bluetooth telephony device like headset/earbuds -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- Optional: Add this permission if you want to save your recordings in public folders -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- min SDK: 23 (amrNb/amrWb: 26, Opus: 29)
iOS
<key>NSMicrophoneUsageDescription</key>
<string>Some message to describe why you need this permission</string>
- min SDK: 11.0
macOS
<key>NSMicrophoneUsageDescription</key>
<string>Some message to describe why you need this permission</string>
- In capabilities, activate "Audio input" in debug AND release schemes.
- or directly in *.entitlements files
<key>com.apple.security.device.audio-input</key>
<true/>
- min SDK: 10.15
Web
Web platform uses package web >=0.5.1 which is shipped with Flutter >=3.22.
This platform is still available with previous Flutter versions but continuous work is done from this version only.