Search code examples
flutteraudiomp3

Flutter : record audio in mp3


I'm using flutter_sound to record audio in my app , but i need that record to be in mp3, i've tried

String path = await flutterSound.startRecorder(
      uri: 'sound$numRecord.mp3',);

but when i upload the file to the server it tells me that the file type is

"file_type":"video\/mp4"

not

"audio\/mpeg" 

so i tried to set the codec to mp3

String path = await flutterSound.startRecorder(
      uri: 'sound$numRecord.mp3',codec: t_CODEC.CODEC_MP3);

and i get RecorderRunningException , because CODEC_MP3 is not supported, so is there anyway to record in mp3 in both android and ios ?


Solution

  • You can use package https://pub.dev/packages/record_mp3
    This package support both Android and iOS

    working demo

    enter image description here

    full example code

    import 'dart:io';
    import 'package:audioplayers/audioplayers.dart';
    import 'package:flutter/material.dart';
    import 'dart:async';
    import 'package:path_provider/path_provider.dart';
    import 'package:permission_handler/permission_handler.dart';
    import 'package:record_mp3/record_mp3.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      String statusText = "";
      bool isComplete = false;
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Plugin example app'),
            ),
            body: Column(children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  Expanded(
                    child: GestureDetector(
                      child: Container(
                        height: 48.0,
                        decoration: BoxDecoration(color: Colors.red.shade300),
                        child: Center(
                          child: Text(
                            'start',
                            style: TextStyle(color: Colors.white),
                          ),
                        ),
                      ),
                      onTap: () async {
                        startRecord();
                      },
                    ),
                  ),
                  Expanded(
                    child: GestureDetector(
                      child: Container(
                        height: 48.0,
                        decoration: BoxDecoration(color: Colors.blue.shade300),
                        child: Center(
                          child: Text(
                            RecordMp3.instance.status == RecordStatus.PAUSE
                                ? 'resume'
                                : 'pause',
                            style: TextStyle(color: Colors.white),
                          ),
                        ),
                      ),
                      onTap: () {
                        pauseRecord();
                      },
                    ),
                  ),
                  Expanded(
                    child: GestureDetector(
                      child: Container(
                        height: 48.0,
                        decoration: BoxDecoration(color: Colors.green.shade300),
                        child: Center(
                          child: Text(
                            'stop',
                            style: TextStyle(color: Colors.white),
                          ),
                        ),
                      ),
                      onTap: () {
                        stopRecord();
                      },
                    ),
                  ),
                ],
              ),
              Padding(
                padding: const EdgeInsets.only(top: 20.0),
                child: Text(
                  statusText,
                  style: TextStyle(color: Colors.red, fontSize: 20),
                ),
              ),
              GestureDetector(
                behavior: HitTestBehavior.opaque,
                onTap: () {
                  play();
                },
                child: Container(
                  margin: EdgeInsets.only(top: 30),
                  alignment: AlignmentDirectional.center,
                  width: 100,
                  height: 50,
                  child: isComplete && recordFilePath != null
                      ? Text(
                          "播放",
                          style: TextStyle(color: Colors.red, fontSize: 20),
                        )
                      : Container(),
                ),
              ),
            ]),
          ),
        );
      }
    
      Future<bool> checkPermission() async {
        Map<PermissionGroup, PermissionStatus> map = await new PermissionHandler()
            .requestPermissions(
                [PermissionGroup.storage, PermissionGroup.microphone]);
        print(map[PermissionGroup.microphone]);
        return map[PermissionGroup.microphone] == PermissionStatus.granted;
      }
    
      void startRecord() async {
        bool hasPermission = await checkPermission();
        if (hasPermission) {
          statusText = "正在录音中...";
          recordFilePath = await getFilePath();
          isComplete = false;
          RecordMp3.instance.start(recordFilePath, (type) {
            statusText = "录音失败--->$type";
            setState(() {});
          });
        } else {
          statusText = "没有录音权限";
        }
        setState(() {});
      }
    
      void pauseRecord() {
        if (RecordMp3.instance.status == RecordStatus.PAUSE) {
          bool s = RecordMp3.instance.resume();
          if (s) {
            statusText = "正在录音中...";
            setState(() {});
          }
        } else {
          bool s = RecordMp3.instance.pause();
          if (s) {
            statusText = "录音暂停中...";
            setState(() {});
          }
        }
      }
    
      void stopRecord() {
        bool s = RecordMp3.instance.stop();
        if (s) {
          statusText = "录音已完成";
          isComplete = true;
          setState(() {});
        }
      }
    
      void resumeRecord() {
        bool s = RecordMp3.instance.resume();
        if (s) {
          statusText = "正在录音中...";
          setState(() {});
        }
      }
    
      String recordFilePath;
    
      void play() {
        if (recordFilePath != null && File(recordFilePath).existsSync()) {
          AudioPlayer audioPlayer = AudioPlayer();
          audioPlayer.play(recordFilePath, isLocal: true);
        }
      }
    
      int i = 0;
    
      Future<String> getFilePath() async {
        Directory storageDirectory = await getApplicationDocumentsDirectory();
        String sdPath = storageDirectory.path + "/record";
        var d = Directory(sdPath);
        if (!d.existsSync()) {
          d.createSync(recursive: true);
        }
        return sdPath + "/test_${i++}.mp3";
      }
    }