Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:async';
- import 'dart:html';
- import 'dart:typed_data';
- import 'package:flutter/material.dart';
- import 'package:http/http.dart' as http;
- import 'package:just_audio/just_audio.dart';
- class _Recorder {
- MediaRecorder? _mediaRecorder;
- List<Blob>? _audioBlobParts;
- String? _recordingUrl;
- Future<void> init() async {
- assert(_mediaRecorder == null);
- final stream =
- await window.navigator.mediaDevices?.getUserMedia({'audio': true});
- if (stream == null) return;
- _mediaRecorder = MediaRecorder(stream);
- _audioBlobParts = [];
- _mediaRecorder!.addEventListener('dataavailable', _onDataAvailable);
- }
- void _onDataAvailable(Event event) {
- final blobEvent = event as BlobEvent;
- _audioBlobParts!.add(blobEvent.data!);
- }
- Future<void> start() async {
- assert(_mediaRecorder != null);
- _mediaRecorder!.start();
- }
- /// Stops the recorder and returns an URL pointing to the recording.
- Future<String> stop() async {
- assert(_mediaRecorder != null);
- assert(_recordingUrl == null);
- final completer = Completer<String>();
- void onStop(_) {
- assert(_audioBlobParts != null);
- final blob = Blob(_audioBlobParts!);
- _audioBlobParts = null;
- completer.complete(Url.createObjectUrl(blob));
- }
- _mediaRecorder!.addEventListener('stop', onStop);
- _mediaRecorder!.stop();
- _recordingUrl = await completer.future;
- _mediaRecorder!.removeEventListener('stop', onStop);
- return _recordingUrl!;
- }
- Future<Uint8List> toBytes() async {
- assert(_recordingUrl != null);
- final result = await http.get(Uri.parse(_recordingUrl!));
- return result.bodyBytes;
- }
- void dispose() {
- assert(_mediaRecorder != null);
- _mediaRecorder!.removeEventListener('dataavailable', _onDataAvailable);
- _mediaRecorder = null;
- }
- }
- void main() {
- runApp(const MicrophoneExampleApp());
- }
- class MicrophoneExampleApp extends StatefulWidget {
- /// Constructs [MicrophoneExampleApp].
- const MicrophoneExampleApp({super.key});
- @override
- State<MicrophoneExampleApp> createState() => _MicrophoneExampleAppState();
- }
- class _MicrophoneExampleAppState extends State<MicrophoneExampleApp> {
- _Recorder? _recorder;
- AudioPlayer? _audioPlayer;
- @override
- void dispose() {
- _recorder?.dispose();
- _audioPlayer?.dispose();
- super.dispose();
- }
- Future<void> _initRecorder() async {
- _recorder?.dispose();
- await window.navigator.permissions?.query({'name': 'microphone'});
- _recorder = _Recorder();
- await _recorder!.init();
- }
- @override
- Widget build(BuildContext context) {
- return MaterialApp(
- home: Scaffold(
- body: Center(
- child: Column(
- children: [
- OutlinedButton(
- onPressed: _initRecorder,
- child: const Text('Restart recorder'),
- ),
- OutlinedButton(
- onPressed: () {
- _recorder?.start();
- },
- child: const Text('Start recording'),
- ),
- OutlinedButton(
- onPressed: () async {
- await _recorder?.stop();
- },
- child: const Text('Stop recording'),
- ),
- OutlinedButton(
- onPressed: () async {
- final bytes = await _recorder?.toBytes();
- print(bytes);
- },
- child: const Text('To Butes'),
- ),
- OutlinedButton(
- onPressed: () async {
- _audioPlayer?.dispose();
- _audioPlayer = AudioPlayer();
- await _audioPlayer!.setUrl(_recorder!._recordingUrl!);
- await _audioPlayer!.play();
- },
- child: const Text('Play recording'),
- ),
- ],
- ),
- ),
- ),
- );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement