Comments (3)
I just changed few lines in the MediarecorderWrapper.
here is the full code of this wrapper 👍
function MediaRecorderWrapper(mediaStream) {
// if user chosen only audio option; and he tried to pass MediaStream with
// both audio and video tracks;
// using a dirty workaround to generate audio-only stream so that we can get audio/ogg output.
if (this.type == 'audio' && mediaStream.getVideoTracks && mediaStream.getVideoTracks().length && !navigator.mozGetUserMedia) {
var context = new AudioContext();
var mediaStreamSource = context.createMediaStreamSource(mediaStream);
var destination = context.createMediaStreamDestination();
mediaStreamSource.connect(destination);
mediaStream = destination.stream;
}
// void start(optional long timeSlice)
// timestamp to fire "ondataavailable"
// starting a recording session; which will initiate "Reading Thread"
// "Reading Thread" are used to prevent main-thread blocking scenarios
this.start = function(mTimeSlice) {
mTimeSlice = mTimeSlice || 1000;
isStopRecording = false;
function startRecording() {
if (isStopRecording) return;
mediaRecorder = new MediaRecorder(mediaStream);
mediaRecorder.ondataavailable = function(e) {
console.log('ondataavailable', e.data.type, e.data.size, e.data);
// mediaRecorder.state == 'recording' means that media recorder is associated with "session"
// mediaRecorder.state == 'stopped' means that media recorder is detached from the "session" ... in this case; "session" will also be deleted.
if (!e.data.size) {
console.warn('Recording of', e.data.type, 'failed.');
return;
}
// at this stage, Firefox MediaRecorder API doesn't allow to choose the output mimeType format!
var blob = new window.Blob([e.data], {
type: e.data.type || self.mimeType || 'audio/ogg' // It specifies the container format as well as the audio and video capture formats.
});
// Dispatching OnDataAvailable Handler
self.ondataavailable(blob);
};
mediaRecorder.onstop = function(error) {
// for video recording on Firefox, it will be fired quickly.
// because work on VideoFrameContainer is still in progress
// https://wiki.mozilla.org/Gecko:MediaRecorder
//self.onstop(error);
};
// http://www.w3.org/TR/2012/WD-dom-20121206/#error-names-table
// showBrowserSpecificIndicator: got neither video nor audio access
// "VideoFrameContainer" can't be accessed directly; unable to find any wrapper using it.
// that's why there is no video recording support on firefox
// video recording fails because there is no encoder available there
// http://dxr.mozilla.org/mozilla-central/source/content/media/MediaRecorder.cpp#317
// Maybe "Read Thread" doesn't fire video-track read notification;
// that's why shutdown notification is received; and "Read Thread" is stopped.
// https://dvcs.w3.org/hg/dap/raw-file/default/media-stream-capture/MediaRecorder.html#error-handling
mediaRecorder.onerror = function(error) {
console.error(error);
self.start(mTimeSlice);
};
mediaRecorder.onwarning = function(warning) {
console.warn(warning);
};
// void start(optional long mTimeSlice)
// The interval of passing encoded data from EncodedBufferCache to onDataAvailable
// handler. "mTimeSlice < 0" means Session object does not push encoded data to
// onDataAvailable, instead, it passive wait the client side pull encoded data
// by calling requestData API.
mediaRecorder.start(0);
// Start recording. If timeSlice has been provided, mediaRecorder will
// raise a dataavailable event containing the Blob of collected data on every timeSlice milliseconds.
// If timeSlice isn't provided, UA should call the RequestData to obtain the Blob data, also set the mTimeSlice to zero.
setTimeout(function() {
if(!isStopRecording && mediaRecorder){
mediaRecorder.stop();
startRecording();
}
}, mTimeSlice);
}
// dirty workaround to fix Firefox 2nd+ intervals
startRecording();
};
var isStopRecording = false;
this.stop = function() {
isStopRecording = true;
mediaRecorder.stop();
if (self.onstop) {
self.onstop({});
}
};
this.ondataavailable = this.onstop = function() {};
// Reference to itself
var self = this;
if (!self.mimeType && !!mediaStream.getAudioTracks) {
self.mimeType = mediaStream.getAudioTracks().length && mediaStream.getVideoTracks().length ? 'video/webm' : 'audio/ogg';
}
// Reference to "MediaRecorderWrapper" object
var mediaRecorder;
}
Hope it helps.
from mediastreamrecorder.
Finally, I manage to workaround this behaviour.
On MediaRecorderWrapper, I have added a !isStopRecording test in the setTimeout call (line 229), so that I know if stop was requested.
Then in the this.stop function, I have added a call to mediaRecorder.stop().
I seems it works as expected.
If you need the code I can sent it.
cheers
from mediastreamrecorder.
I have the same problem with video recording. I tried solution that you're describing, but there's problem with it.
Just adding !isStopRecording
condition to setTimeout
doesn't have any effect. And adding mediaRecorder.stop()
to this.stop()
yields error
InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
But perhaps I'm doing it wrong. Could you show me the code?
The only way I successfully managed to fire ondataavailable before the original timeout was by turning off the stream it self with something like
$scope.stopRecording = function() {
$scope.mediaRecorder.stop();
$scope.mediaRecorder.stream.stop();
};
But this is not acceptable solution, because I need to be able to start recording again immediately and by cutting of the stream I turn off webcam I cant get it on again :(
from mediastreamrecorder.
Related Issues (20)
- ondataavailable not being called HOT 2
- Allow receiving of ArrayBuffer instead of blobs
- 'onstart' event is not implemented
- how to record the sound of bluetooth headset
- Save recording as MPEG-TS HOT 3
- No MediaRecorder handler can be created HOT 2
- Very high CPU utilization on chrome version 77.X HOT 2
- How to record the system sound or the other party's voice
- Audio Channels constraint
- Float32 to Int16 in StereoAudioRecorderHelper.js
- why I can't save my record file,it's downloaded,but cant play in my player but the bolb link can play in browser HOT 2
- streams with audiotracks only are not recorded and give any data on ondataavailable event HOT 3
- Example of how to record the screen? HOT 1
- MultiStreamRecorder with 1 audio only and 1 video stream results in poor video quality (low resolution) HOT 1
- Deprecation: ScriptProcessorNode
- I want to open two (or more) screens with different sources.
- ERROR TypeError: Failed to construct 'MediaRecorder': parameter 1 is not of type 'MediaStream'.
- exact sync of video and audio HOT 1
- Get audio blob on demand explicitly.
- gif chrome
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from mediastreamrecorder.