Advertisement
DVS_studio

Untitled

Feb 29th, 2024
898
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 3.99 KB | None | 0 0
  1. import 'dart:async';
  2. import 'dart:html';
  3. import 'dart:typed_data';
  4.  
  5. import 'package:flutter/material.dart';
  6. import 'package:http/http.dart' as http;
  7. import 'package:just_audio/just_audio.dart';
  8.  
  9. class _Recorder {
  10.   MediaRecorder? _mediaRecorder;
  11.   List<Blob>? _audioBlobParts;
  12.   String? _recordingUrl;
  13.  
  14.   Future<void> init() async {
  15.     assert(_mediaRecorder == null);
  16.  
  17.     final stream =
  18.         await window.navigator.mediaDevices?.getUserMedia({'audio': true});
  19.     if (stream == null) return;
  20.     _mediaRecorder = MediaRecorder(stream);
  21.  
  22.     _audioBlobParts = [];
  23.     _mediaRecorder!.addEventListener('dataavailable', _onDataAvailable);
  24.   }
  25.  
  26.   void _onDataAvailable(Event event) {
  27.     final blobEvent = event as BlobEvent;
  28.     _audioBlobParts!.add(blobEvent.data!);
  29.   }
  30.  
  31.   Future<void> start() async {
  32.     assert(_mediaRecorder != null);
  33.  
  34.     _mediaRecorder!.start();
  35.   }
  36.  
  37.   /// Stops the recorder and returns an URL pointing to the recording.
  38.   Future<String> stop() async {
  39.     assert(_mediaRecorder != null);
  40.     assert(_recordingUrl == null);
  41.  
  42.     final completer = Completer<String>();
  43.  
  44.     void onStop(_) {
  45.       assert(_audioBlobParts != null);
  46.  
  47.       final blob = Blob(_audioBlobParts!);
  48.       _audioBlobParts = null;
  49.  
  50.       completer.complete(Url.createObjectUrl(blob));
  51.     }
  52.  
  53.     _mediaRecorder!.addEventListener('stop', onStop);
  54.     _mediaRecorder!.stop();
  55.     _recordingUrl = await completer.future;
  56.     _mediaRecorder!.removeEventListener('stop', onStop);
  57.  
  58.     return _recordingUrl!;
  59.   }
  60.  
  61.   Future<Uint8List> toBytes() async {
  62.     assert(_recordingUrl != null);
  63.  
  64.     final result = await http.get(Uri.parse(_recordingUrl!));
  65.     return result.bodyBytes;
  66.   }
  67.  
  68.   void dispose() {
  69.     assert(_mediaRecorder != null);
  70.  
  71.     _mediaRecorder!.removeEventListener('dataavailable', _onDataAvailable);
  72.     _mediaRecorder = null;
  73.   }
  74. }
  75.  
  76. void main() {
  77.   runApp(const MicrophoneExampleApp());
  78. }
  79.  
  80. class MicrophoneExampleApp extends StatefulWidget {
  81.   /// Constructs [MicrophoneExampleApp].
  82.   const MicrophoneExampleApp({super.key});
  83.  
  84.   @override
  85.   State<MicrophoneExampleApp> createState() => _MicrophoneExampleAppState();
  86. }
  87.  
  88. class _MicrophoneExampleAppState extends State<MicrophoneExampleApp> {
  89.   _Recorder? _recorder;
  90.   AudioPlayer? _audioPlayer;
  91.  
  92.   @override
  93.   void dispose() {
  94.     _recorder?.dispose();
  95.     _audioPlayer?.dispose();
  96.     super.dispose();
  97.   }
  98.  
  99.   Future<void> _initRecorder() async {
  100.     _recorder?.dispose();
  101.     await window.navigator.permissions?.query({'name': 'microphone'});
  102.     _recorder = _Recorder();
  103.     await _recorder!.init();
  104.   }
  105.  
  106.   @override
  107.   Widget build(BuildContext context) {
  108.     return MaterialApp(
  109.       home: Scaffold(
  110.         body: Center(
  111.           child: Column(
  112.             children: [
  113.               OutlinedButton(
  114.                 onPressed: _initRecorder,
  115.                 child: const Text('Restart recorder'),
  116.               ),
  117.               OutlinedButton(
  118.                 onPressed: () {
  119.                   _recorder?.start();
  120.                 },
  121.                 child: const Text('Start recording'),
  122.               ),
  123.               OutlinedButton(
  124.                 onPressed: () async {
  125.                   await _recorder?.stop();
  126.                 },
  127.                 child: const Text('Stop recording'),
  128.               ),
  129.               OutlinedButton(
  130.                 onPressed: () async {
  131.                   final bytes = await _recorder?.toBytes();
  132.                   print(bytes);
  133.                 },
  134.                 child: const Text('To Butes'),
  135.               ),
  136.               OutlinedButton(
  137.                 onPressed: () async {
  138.                   _audioPlayer?.dispose();
  139.                   _audioPlayer = AudioPlayer();
  140.                   await _audioPlayer!.setUrl(_recorder!._recordingUrl!);
  141.                   await _audioPlayer!.play();
  142.                 },
  143.                 child: const Text('Play recording'),
  144.               ),
  145.             ],
  146.           ),
  147.         ),
  148.       ),
  149.     );
  150.   }
  151. }
  152.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement