-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathRecorder.js
More file actions
84 lines (68 loc) · 1.69 KB
/
Recorder.js
File metadata and controls
84 lines (68 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import React, { Component } from 'react';
import RecorderJS from 'recorder-js';
import { getAudioStream, exportBuffer } from '../utilities/audio';
class Recorder extends Component {
constructor(props) {
super(props);
this.state = {
stream: null,
recording: false,
recorder: null
};
this.startRecord = this.startRecord.bind(this);
this.stopRecord = this.stopRecord.bind(this);
}
async componentDidMount() {
let stream;
try {
stream = await getAudioStream();
} catch (error) {
// Users browser doesn't support audio.
// Add your handler here.
console.log(error);
}
this.setState({ stream });
}
startRecord() {
const { stream } = this.state;
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const recorder = new RecorderJS(audioContext);
recorder.init(stream);
this.setState(
{
recorder,
recording: true
},
() => {
recorder.start();
}
);
}
async stopRecord() {
const { recorder } = this.state;
const { buffer } = await recorder.stop()
const audio = exportBuffer(buffer[0]);
// Process the audio here.
console.log(audio);
this.setState({
recording: false
});
}
render() {
const { recording, stream } = this.state;
// Don't show record button if their browser doesn't support it.
if (!stream) {
return null;
}
return (
<button
onClick={() => {
recording ? this.stopRecord() : this.startRecord();
}}
>
{recording ? 'Stop Recording' : 'Start Recording'}
</button>
);
}
}
export default Recorder;