Skip to content

Commit 62ab10e

Browse files
committed
Added [email protected] Fixed tinny bugs in MediaRecorderWrapper.js
1 parent ce029d2 commit 62ab10e

11 files changed

+179
-28
lines changed

AudioStreamRecorder/MediaRecorderWrapper.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function MediaRecorderWrapper(mediaStream) {
2222
* @example
2323
* recorder.record();
2424
*/
25-
this.start = function(timeSlice) {
25+
this.start = function(timeSlice, __disableLogs) {
2626
if (!self.mimeType) {
2727
self.mimeType = 'video/webm';
2828
}
@@ -46,12 +46,13 @@ function MediaRecorderWrapper(mediaStream) {
4646
}
4747

4848
self.blob = null;
49+
self.dontFireOnDataAvailableEvent = false;
4950

5051
var recorderHints = {
5152
mimeType: self.mimeType
5253
};
5354

54-
if (!self.disableLogs) {
55+
if (!self.disableLogs && !__disableLogs) {
5556
console.log('Passing following params over MediaRecorder API.', recorderHints);
5657
}
5758

@@ -99,8 +100,12 @@ function MediaRecorderWrapper(mediaStream) {
99100

100101
self.ondataavailable(blob);
101102

103+
self.dontFireOnDataAvailableEvent = true;
104+
mediaRecorder.stop();
105+
mediaRecorder = null;
106+
102107
// record next interval
103-
self.start(timeSlice);
108+
self.start(timeSlice, '__disableLogs');
104109
};
105110

106111
mediaRecorder.onerror = function(error) {
@@ -146,7 +151,7 @@ function MediaRecorderWrapper(mediaStream) {
146151
if (mediaRecorder.state === 'recording') {
147152
// "stop" method auto invokes "requestData"!
148153
mediaRecorder.requestData();
149-
mediaRecorder.stop();
154+
// mediaRecorder.stop();
150155
}
151156
}, timeSlice);
152157

@@ -176,7 +181,14 @@ function MediaRecorderWrapper(mediaStream) {
176181
if (mediaRecorder.state === 'recording') {
177182
// "stop" method auto invokes "requestData"!
178183
mediaRecorder.requestData();
179-
mediaRecorder.stop();
184+
185+
setTimeout(function() {
186+
self.dontFireOnDataAvailableEvent = true;
187+
if (mediaRecorder.state === 'recording') {
188+
mediaRecorder.stop();
189+
}
190+
mediaRecorder = null;
191+
}, 2000);
180192
}
181193
};
182194

Gruntfile.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ module.exports = function(grunt) {
3333
'VideoStreamRecorder/WhammyRecorderHelper.js',
3434
'VideoStreamRecorder/GifRecorder.js',
3535
'VideoStreamRecorder/lib/whammy.js',
36+
'common/ConcatenateBlobs.js',
3637
'common/amd.js'
3738
],
3839
dest: 'MediaStreamRecorder.js'

MediaStreamRecorder.js

Lines changed: 83 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Last time updated: 2016-05-05 6:31:59 AM UTC
1+
// Last time updated: 2016-05-15 5:22:54 AM UTC
22

33
// links:
44
// Open-Sourced: https://github.com/streamproc/MediaStreamRecorder
@@ -106,11 +106,9 @@ function MediaStreamRecorder(mediaStream) {
106106
return;
107107
}
108108

109-
var bigBlob = new Blob(mediaRecorder.blobs, {
110-
type: mediaRecorder.blobs[0].type || this.mimeType
109+
ConcatenateBlobs(mediaRecorder.blobs, mediaRecorder.blobs[0].type, function(concatenatedBlob) {
110+
invokeSaveAsDialog(concatenatedBlob);
111111
});
112-
113-
invokeSaveAsDialog(bigBlob);
114112
return;
115113
}
116114
invokeSaveAsDialog(file, fileName);
@@ -616,7 +614,7 @@ function MediaRecorderWrapper(mediaStream) {
616614
* @example
617615
* recorder.record();
618616
*/
619-
this.start = function(timeSlice) {
617+
this.start = function(timeSlice, __disableLogs) {
620618
if (!self.mimeType) {
621619
self.mimeType = 'video/webm';
622620
}
@@ -640,12 +638,13 @@ function MediaRecorderWrapper(mediaStream) {
640638
}
641639

642640
self.blob = null;
641+
self.dontFireOnDataAvailableEvent = false;
643642

644643
var recorderHints = {
645644
mimeType: self.mimeType
646645
};
647646

648-
if (!self.disableLogs) {
647+
if (!self.disableLogs && !__disableLogs) {
649648
console.log('Passing following params over MediaRecorder API.', recorderHints);
650649
}
651650

@@ -693,8 +692,12 @@ function MediaRecorderWrapper(mediaStream) {
693692

694693
self.ondataavailable(blob);
695694

695+
self.dontFireOnDataAvailableEvent = true;
696+
mediaRecorder.stop();
697+
mediaRecorder = null;
698+
696699
// record next interval
697-
self.start(timeSlice);
700+
self.start(timeSlice, '__disableLogs');
698701
};
699702

700703
mediaRecorder.onerror = function(error) {
@@ -740,7 +743,7 @@ function MediaRecorderWrapper(mediaStream) {
740743
if (mediaRecorder.state === 'recording') {
741744
// "stop" method auto invokes "requestData"!
742745
mediaRecorder.requestData();
743-
mediaRecorder.stop();
746+
// mediaRecorder.stop();
744747
}
745748
}, timeSlice);
746749

@@ -770,7 +773,14 @@ function MediaRecorderWrapper(mediaStream) {
770773
if (mediaRecorder.state === 'recording') {
771774
// "stop" method auto invokes "requestData"!
772775
mediaRecorder.requestData();
773-
mediaRecorder.stop();
776+
777+
setTimeout(function() {
778+
self.dontFireOnDataAvailableEvent = true;
779+
if (mediaRecorder.state === 'recording') {
780+
mediaRecorder.stop();
781+
}
782+
mediaRecorder = null;
783+
}, 2000);
774784
}
775785
};
776786

@@ -2113,6 +2123,69 @@ if (typeof MediaStreamRecorder !== 'undefined') {
21132123
MediaStreamRecorder.Whammy = Whammy;
21142124
}
21152125

2126+
// Last time updated at Nov 18, 2014, 08:32:23
2127+
2128+
// Latest file can be found here: https://cdn.webrtc-experiment.com/ConcatenateBlobs.js
2129+
2130+
// Muaz Khan - www.MuazKhan.com
2131+
// MIT License - www.WebRTC-Experiment.com/licence
2132+
// Source Code - https://github.com/muaz-khan/ConcatenateBlobs
2133+
// Demo - https://www.WebRTC-Experiment.com/ConcatenateBlobs/
2134+
2135+
// ___________________
2136+
// ConcatenateBlobs.js
2137+
2138+
// Simply pass array of blobs.
2139+
// This javascript library will concatenate all blobs in single "Blob" object.
2140+
2141+
(function() {
2142+
window.ConcatenateBlobs = function(blobs, type, callback) {
2143+
var buffers = [];
2144+
2145+
var index = 0;
2146+
2147+
function readAsArrayBuffer() {
2148+
if (!blobs[index]) {
2149+
return concatenateBuffers();
2150+
}
2151+
var reader = new FileReader();
2152+
reader.onload = function(event) {
2153+
buffers.push(event.target.result);
2154+
index++;
2155+
readAsArrayBuffer();
2156+
};
2157+
reader.readAsArrayBuffer(blobs[index]);
2158+
}
2159+
2160+
readAsArrayBuffer();
2161+
2162+
function concatenateBuffers() {
2163+
var byteLength = 0;
2164+
buffers.forEach(function(buffer) {
2165+
byteLength += buffer.byteLength;
2166+
});
2167+
2168+
var tmp = new Uint16Array(byteLength);
2169+
var lastOffset = 0;
2170+
buffers.forEach(function(buffer) {
2171+
// BYTES_PER_ELEMENT == 2 for Uint16Array
2172+
var reusableByteLength = buffer.byteLength;
2173+
if (reusableByteLength % 2 != 0) {
2174+
buffer = buffer.slice(0, reusableByteLength - 1)
2175+
}
2176+
tmp.set(new Uint16Array(buffer), lastOffset);
2177+
lastOffset += reusableByteLength;
2178+
});
2179+
2180+
var blob = new Blob([tmp.buffer], {
2181+
type: type
2182+
});
2183+
2184+
callback(blob);
2185+
}
2186+
};
2187+
})();
2188+
21162189
// https://github.com/streamproc/MediaStreamRecorder/issues/42
21172190
if (typeof module !== 'undefined' /* && !!module.exports*/ ) {
21182191
module.exports = MediaStreamRecorder;

MediaStreamRecorder.min.js

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ Then link single/standalone "MediaStreamRecorder.js" file:
7575
<script src="https://cdn.webrtc-experiment.com/MediaStreamRecorder.js"> </script>
7676

7777
<!-- or link specific release -->
78-
<script src="https://github.com/streamproc/MediaStreamRecorder/releases/download/1.3.1/MediaStreamRecorder.js"></script>
78+
<script src="https://github.com/streamproc/MediaStreamRecorder/releases/download/1.3.2/MediaStreamRecorder.js"></script>
7979
```
8080

8181
## Record audio+video

bower.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "msr",
3-
"version": "1.3.1",
3+
"version": "1.3.2",
44
"authors": [
55
{
66
"name": "Muaz Khan",
@@ -62,7 +62,7 @@
6262
"grunt-contrib-concat": "0.5.1",
6363
"grunt-contrib-csslint": "0.4.0",
6464
"grunt-contrib-uglify": "0.9.1",
65-
"grunt-htmlhint": "0.4.1",
65+
"grunt-htmlhint": "0.9.13",
6666
"grunt-jsbeautifier": "0.2.10",
6767
"grunt-bump": "0.3.1"
6868
}

common/ConcatenateBlobs.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Last time updated at Nov 18, 2014, 08:32:23
2+
3+
// Latest file can be found here: https://cdn.webrtc-experiment.com/ConcatenateBlobs.js
4+
5+
// Muaz Khan - www.MuazKhan.com
6+
// MIT License - www.WebRTC-Experiment.com/licence
7+
// Source Code - https://github.com/muaz-khan/ConcatenateBlobs
8+
// Demo - https://www.WebRTC-Experiment.com/ConcatenateBlobs/
9+
10+
// ___________________
11+
// ConcatenateBlobs.js
12+
13+
// Simply pass array of blobs.
14+
// This javascript library will concatenate all blobs in single "Blob" object.
15+
16+
(function() {
17+
window.ConcatenateBlobs = function(blobs, type, callback) {
18+
var buffers = [];
19+
20+
var index = 0;
21+
22+
function readAsArrayBuffer() {
23+
if (!blobs[index]) {
24+
return concatenateBuffers();
25+
}
26+
var reader = new FileReader();
27+
reader.onload = function(event) {
28+
buffers.push(event.target.result);
29+
index++;
30+
readAsArrayBuffer();
31+
};
32+
reader.readAsArrayBuffer(blobs[index]);
33+
}
34+
35+
readAsArrayBuffer();
36+
37+
function concatenateBuffers() {
38+
var byteLength = 0;
39+
buffers.forEach(function(buffer) {
40+
byteLength += buffer.byteLength;
41+
});
42+
43+
var tmp = new Uint16Array(byteLength);
44+
var lastOffset = 0;
45+
buffers.forEach(function(buffer) {
46+
// BYTES_PER_ELEMENT == 2 for Uint16Array
47+
var reusableByteLength = buffer.byteLength;
48+
if (reusableByteLength % 2 != 0) {
49+
buffer = buffer.slice(0, reusableByteLength - 1)
50+
}
51+
tmp.set(new Uint16Array(buffer), lastOffset);
52+
lastOffset += reusableByteLength;
53+
});
54+
55+
var blob = new Blob([tmp.buffer], {
56+
type: type
57+
});
58+
59+
callback(blob);
60+
}
61+
};
62+
})();

common/MediaStreamRecorder.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,9 @@ function MediaStreamRecorder(mediaStream) {
8282
return;
8383
}
8484

85-
var bigBlob = new Blob(mediaRecorder.blobs, {
86-
type: mediaRecorder.blobs[0].type || this.mimeType
85+
ConcatenateBlobs(mediaRecorder.blobs, mediaRecorder.blobs[0].type, function(concatenatedBlob) {
86+
invokeSaveAsDialog(concatenatedBlob);
8787
});
88-
89-
invokeSaveAsDialog(bigBlob);
9088
return;
9189
}
9290
invokeSaveAsDialog(file, fileName);

demos/audio-recorder.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ <h1>
120120
document.querySelector('#save-recording').onclick = function() {
121121
this.disabled = true;
122122
mediaRecorder.save();
123+
124+
// alert('Drop WebM file on Chrome or Firefox. Both can play entire file. VLC player or other players may not work.');
123125
};
124126

125127
var mediaRecorder;

demos/video-recorder.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
<article>
3636
<header style="text-align: center;">
3737
<h1>
38-
<a href="https://www.webrtc-experiment.com/">WebRTC</a> Video Recording using <a href="https://github.com/streamproc/MediaStreamRecorder" target="_blank">MediaStreamRecorder</a>
39-
</h1>
38+
<a href="https://www.webrtc-experiment.com/">WebRTC</a> Video Recording using <a href="https://github.com/streamproc/MediaStreamRecorder" target="_blank">MediaStreamRecorder</a>
39+
</h1>
4040
<p>
4141
<a href="https://www.webrtc-experiment.com/">HOME</a>
4242
<span> &copy; </span>
@@ -117,6 +117,8 @@ <h1>
117117
document.querySelector('#save-recording').onclick = function() {
118118
this.disabled = true;
119119
mediaRecorder.save();
120+
121+
// alert('Drop WebM file on Chrome or Firefox. Both can play entire file. VLC player or other players may not work.');
120122
};
121123

122124
var mediaRecorder;

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "msr",
33
"preferGlobal": false,
4-
"version": "1.3.1",
4+
"version": "1.3.2",
55
"author": {
66
"name": "Muaz Khan",
77
"email": "[email protected]",
@@ -68,7 +68,7 @@
6868
"grunt-contrib-concat": "0.5.1",
6969
"grunt-contrib-csslint": "0.4.0",
7070
"grunt-contrib-uglify": "0.9.1",
71-
"grunt-htmlhint": "0.4.1",
71+
"grunt-htmlhint": "0.9.13",
7272
"grunt-jsbeautifier": "0.2.10",
7373
"grunt-bump": "0.3.1"
7474
}

0 commit comments

Comments
 (0)