jiti-meet/react/features/local-recording/recording/OggAdapter.js

99 lines
2.3 KiB
JavaScript
Raw Normal View History

import { RecordingAdapter } from './RecordingAdapter';
import { downloadBlob, timestampString } from './Utils';
const logger = require('jitsi-meet-logger').getLogger(__filename);
/**
* RecordingAdapter implementation that uses MediaRecorder
* (default browser encoding with Opus codec)
*/
export class OggAdapter extends RecordingAdapter {
/**
* Instance of MediaRecorder.
*/
_mediaRecorder = null;
/**
* Implements {@link RecordingAdapter#ensureInitialized()}.
*
* @inheritdoc
*/
ensureInitialized() {
let p = null;
if (this._mediaRecorder === null) {
p = new Promise((resolve, error) => {
this._getAudioStream(0)
.then(stream => {
this._mediaRecorder = new MediaRecorder(stream);
this._mediaRecorder.ondataavailable
= e => this._saveMediaData(e.data);
resolve();
})
.catch(err => {
logger.error(`Error calling getUserMedia(): ${err}`);
error();
});
});
} else {
p = new Promise(resolve => {
resolve();
});
}
return p;
}
/**
* Implements {@link RecordingAdapter#start()}.
*
* @inheritdoc
*/
start() {
return new Promise(resolve => {
this._mediaRecorder.start();
resolve();
});
}
/**
* Implements {@link RecordingAdapter#stop()}.
*
* @inheritdoc
*/
stop() {
return new Promise(
resolve => {
this._mediaRecorder.onstop = () => resolve();
this._mediaRecorder.stop();
}
);
}
/**
* Implements {@link RecordingAdapter#download()}.
*
* @inheritdoc
*/
download() {
if (this._recordedData !== null) {
const audioURL = window.URL.createObjectURL(this._recordedData);
downloadBlob(audioURL, `recording${timestampString()}.ogg`);
}
}
/**
* Callback for encoded data.
*
* @private
* @param {*} data - Encoded data.
* @returns {void}
*/
_saveMediaData(data) {
this._recordedData = data;
}
}