Flutter plugin for sound. Audio recorder and player.
Switch branches/tags
Nothing to show
Clone or download
Latest commit a9eedeb Dec 10, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
android Release 1.2.1. Dec 10, 2018
example Released to 1.1.3. Oct 10, 2018
ios Release 1.2.0. Dec 9, 2018
lib Released to 1.1.3. Oct 10, 2018
.gitignore Initial commit. Aug 13, 2018
CHANGELOG.md Release 1.2.1. Dec 10, 2018
LICENSE Update LICENSE Aug 19, 2018
Logotype primary.png Upload banner Aug 29, 2018
README.md Update README.md Nov 20, 2018
issue_template.md Added issue template. Aug 19, 2018
pubspec.yaml Release 1.2.1. Dec 10, 2018



pub version

This plugin provides simple recorder and player functionalities for both `android` and `ios` platforms. This only supports default file extension for each platform. This plugin handles file from remote url. This plugin can handle playback stream from native (To sync exact time with bridging).

Free Read

Medium Blog

Getting Started

For help getting started with Flutter, view our online documentation.


Add flutter_sound as a dependency in pubspec.yaml For help on adding as a dependency, view the documentation.

Post Installation

On iOS you need to add a usage description to info.plist:

<string>This sample uses the microphone to record your speech and convert it to text.</string>

On Android you need to add a permission to AndroidManifest.xml:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


Func Param Return Description
setSubscriptionDuration double sec String message Set subscription timer in seconds. Default is 0.01 if not using this method.
startRecorder String uri String uri Start recording. This will return uri used.
stopRecorder String message Stop recording.
startPlayer String uri String message Start playing.
stopPlayer String message Stop playing.
pausePlayer String message Pause playing.
resumePlayer String message Resume playing.
seekToPlayer int milliSecs position to goTo String message Seek audio to selected position in seconds. Parameter should be less than audio duration to correctly placed.


Subscription Return Description
onRecorderStateChanged <RecordStatus> Able to listen to subscription when recorder starts.
onPlayerStateChanged <PlayStatus> Able to listen to subscription when player starts.

Default uri path

When uri path is not set during the function call in startRecorder or startPlayer, they are saved in below path depending on the platform.

  • Default path for android
    • sdcard/sound.mp4.
  • Default path for ios
    • sound.m4a.


Creating instance.

FlutterSound flutterSound = new FlutterSound();

Starting recorder with listener.

String path = await flutterSound.startRecorder(null);
print('startRecorder: $path');

_recorderSubscription = flutterSound.onRecorderStateChanged.listen((e) {
  DateTime date = new DateTime.fromMillisecondsSinceEpoch(e.currentPosition.toInt());
  String txt = DateFormat('mm:ss:SS', 'en_US').format(date);

Stop recorder

String result = await flutterSound.stopRecorder();
print('stopRecorder: $result');

if (_recorderSubscription != null) {
	_recorderSubscription = null;

Start player

String path = await flutterSound.startPlayer(null);
print('startPlayer: $path');

_playerSubscription = flutterSound.onPlayerStateChanged.listen((e) {
	if (e != null) {
		DateTime date = new DateTime.fromMillisecondsSinceEpoch(e.currentPosition.toInt());
		String txt = DateFormat('mm:ss:SS', 'en_US').format(date);
		this.setState(() {
			this._isPlaying = true;
			this._playerTxt = txt.substring(0, 8);

Stop player

String result = await flutterSound.stopPlayer();
print('stopPlayer: $result');
if (_playerSubscription != null) {
	_playerSubscription = null;

Pause player

String result = await flutterSound.pausePlayer();

Resume player

String result = await flutterSound.resumePlayer();

Seek player

String result = await flutterSound.seekToPlayer(miliSecs);

Setting subscription duration (Optional). 0.01 is default value when not set.

/// 0.01 is default

Setting volume.

/// 1.0 is default
/// Currently, volume can be changed when player is running. Try manage this right after player starts.
String path = await flutterSound.startPlayer(null);
await flutterSound.setVolume(0.1);


  • Seeking example in Exmaple project
  • Volume Control
  • Sync timing for recorder callback handler

Help Maintenance

I've been maintaining quite many repos these days and burning out slowly. If you could help me cheer up, buying me a cup of coffee will make my life really happy and get much energy out of it.
Buy Me A Coffee