Skip to content

Commit

Permalink
Added msr@1.3.4, Merged & Closed #85 (PCM RAW Audio)
Browse files Browse the repository at this point in the history
Returning Blob rather than ArrayBuffer. You can use FileReader API to
get original buffer.
  • Loading branch information
muaz-khan committed Jul 3, 2016
1 parent 7f5bcd5 commit b6f14b4
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 11 deletions.
25 changes: 25 additions & 0 deletions AudioStreamRecorder/StereoAudioRecorderHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ function StereoAudioRecorderHelper(mediaStream, root) {
var volume;
var audioInput;
var sampleRate = root.sampleRate || deviceSampleRate;

var mimeType = root.mimeType || 'audio/wav';
var isPCM = mimeType.indexOf('audio/pcm') > -1;

var context;

var numChannels = root.audioChannels || 2;
Expand Down Expand Up @@ -66,6 +70,17 @@ function StereoAudioRecorderHelper(mediaStream, root) {
interleaved = interleave(leftBuffer, rightBuffer);
}

if (isPCM) {
// our final binary blob
var blob = new Blob([convertoFloat32ToInt16(interleaved)], {
type: 'audio/pcm'
});

console.debug('audio recorded blob size:', bytesToSize(blob.size));
root.ondataavailable(blob);
return;
}

// we create our wav file
var buffer = new ArrayBuffer(44 + interleaved.length * 2);
var view = new DataView(buffer);
Expand Down Expand Up @@ -151,6 +166,16 @@ function StereoAudioRecorderHelper(mediaStream, root) {
}
}

function convertoFloat32ToInt16(buffer) {
var l = buffer.length;
var buf = new Int16Array(l)

while (l--) {
buf[l] = buffer[l] * 0xFFFF; //convert to 16 bit
}
return buf.buffer
}

// creates the audio context
var context = ObjectStore.AudioContextConstructor;

Expand Down
30 changes: 28 additions & 2 deletions MediaStreamRecorder.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Last time updated: 2016-07-03 8:17:15 AM UTC
// Last time updated: 2016-07-03 8:51:35 AM UTC

// links:
// Open-Sourced: https://github.com/streamproc/MediaStreamRecorder
Expand Down Expand Up @@ -51,7 +51,8 @@ function MediaStreamRecorder(mediaStream) {
}

// audio/wav is supported only via StereoAudioRecorder
if (this.mimeType === 'audio/wav') {
// audio/pcm (int16) is supported only via StereoAudioRecorder
if (this.mimeType === 'audio/wav' || this.mimeType === 'audio/pcm') {
Recorder = StereoAudioRecorder;
}

Expand Down Expand Up @@ -988,6 +989,10 @@ function StereoAudioRecorderHelper(mediaStream, root) {
var volume;
var audioInput;
var sampleRate = root.sampleRate || deviceSampleRate;

var mimeType = root.mimeType || 'audio/wav';
var isPCM = mimeType.indexOf('audio/pcm') > -1;

var context;

var numChannels = root.audioChannels || 2;
Expand Down Expand Up @@ -1031,6 +1036,17 @@ function StereoAudioRecorderHelper(mediaStream, root) {
interleaved = interleave(leftBuffer, rightBuffer);
}

if (isPCM) {
// our final binary blob
var blob = new Blob([convertoFloat32ToInt16(interleaved)], {
type: 'audio/pcm'
});

console.debug('audio recorded blob size:', bytesToSize(blob.size));
root.ondataavailable(blob);
return;
}

// we create our wav file
var buffer = new ArrayBuffer(44 + interleaved.length * 2);
var view = new DataView(buffer);
Expand Down Expand Up @@ -1116,6 +1132,16 @@ function StereoAudioRecorderHelper(mediaStream, root) {
}
}

function convertoFloat32ToInt16(buffer) {
var l = buffer.length;
var buf = new Int16Array(l)

while (l--) {
buf[l] = buffer[l] * 0xFFFF; //convert to 16 bit
}
return buf.buffer
}

// creates the audio context
var context = ObjectStore.AudioContextConstructor;

Expand Down
6 changes: 3 additions & 3 deletions MediaStreamRecorder.min.js

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ Then link single/standalone "MediaStreamRecorder.js" file:
<script src="https://www.webrtc-experiment.com/MediaStreamRecorder.js"> </script>

<!-- or link specific release -->
<script src="https://github.com/streamproc/MediaStreamRecorder/releases/download/1.3.3/MediaStreamRecorder.js"></script>
<script src="https://github.com/streamproc/MediaStreamRecorder/releases/download/1.3.4/MediaStreamRecorder.js"></script>
```

## Record audio+video
Expand Down Expand Up @@ -406,6 +406,7 @@ videoRecorder.mimeType = 'video/mp4';
audioRecorder.mimeType = 'audio/webm'; // MediaRecorderWrapper
audioRecorder.mimeType = 'audio/ogg'; // MediaRecorderWrapper
audioRecorder.mimeType = 'audio/wav'; // StereoAudioRecorder
audioRecorder.mimeType = 'audio/pcm'; // StereoAudioRecorder

// gif:
gifRecorder.mimeType = 'image/gif'; // GifRecorder
Expand Down
2 changes: 1 addition & 1 deletion bower.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "msr",
"version": "1.3.3",
"version": "1.3.4",
"authors": [
{
"name": "Muaz Khan",
Expand Down
3 changes: 2 additions & 1 deletion common/MediaStreamRecorder.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ function MediaStreamRecorder(mediaStream) {
}

// audio/wav is supported only via StereoAudioRecorder
if (this.mimeType === 'audio/wav') {
// audio/pcm (int16) is supported only via StereoAudioRecorder
if (this.mimeType === 'audio/wav' || this.mimeType === 'audio/pcm') {
Recorder = StereoAudioRecorder;
}

Expand Down
11 changes: 9 additions & 2 deletions demos/audio-recorder.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ <h1>
<select id="audio-recorderType" style="font-size:22px;vertical-align: middle;margin-right: 5px;">
<option>[Best Available Recorder]</option>
<option>MediaRecorder API</option>
<option>WebAudio API</option>
<option>WebAudio API (WAV)</option>
<option>WebAudio API (PCM)</option>
</select>
<br>

Expand Down Expand Up @@ -167,8 +168,14 @@ <h1>
mediaRecorder.recorderType = MediaRecorderWrapper;
}

if (recorderType === 'WebAudio API') {
if (recorderType === 'WebAudio API (WAV)') {
mediaRecorder.recorderType = StereoAudioRecorder;
mediaRecorder.mimeType = 'audio/wav';
}

if (recorderType === 'WebAudio API (PCM)') {
mediaRecorder.recorderType = StereoAudioRecorder;
mediaRecorder.mimeType = 'audio/pcm';
}

// don't force any mimeType; use above "recorderType" instead.
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "msr",
"preferGlobal": false,
"version": "1.3.3",
"version": "1.3.4",
"author": {
"name": "Muaz Khan",
"email": "muazkh@gmail.com",
Expand Down

0 comments on commit b6f14b4

Please sign in to comment.