use webm-duration-fix to add SeekHead, use code splitting

This commit is contained in:
or-else
2022-12-04 11:25:06 -08:00
parent d54e4a8153
commit d0a23b0792
9 changed files with 165 additions and 8629 deletions
+3 -28
View File
@@ -4,8 +4,8 @@ import React from 'react';
import AudioPlayer from './audio-player.jsx';
// Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=642012
// import fixWebmDuration from 'fix-webm-duration';
import * as ebml from 'ts-ebml';
// It adds duration and SeekHead to the webm record.
import fixWebmDuration from 'webm-duration-fix';
import { intArrayToBase64 } from '../lib/blob-helpers.js'
import { secondsToTime } from '../lib/strformat';
@@ -272,36 +272,11 @@ export default class AudioRecorder extends React.PureComponent {
getRecording(mimeType, duration) {
mimeType = mimeType || AUDIO_MIME_TYPE;
let blob = new Blob(this.audioChunks, {type: mimeType});
return this.tempFixMetadata(blob, mimeType)
return fixWebmDuration(blob, mimeType)
.then(fixedBlob => { blob = fixedBlob; return fixedBlob.arrayBuffer(); })
.then(arrayBuff => this.audioContext.decodeAudioData(arrayBuff))
.then(decoded => this.createPreview(decoded))
.then(preview => ({url: window.URL.createObjectURL(blob), preview: intArrayToBase64(preview)}));
/*
return (duration > 0 ? ysFixWebmDuration(blob, duration, {logger: false}) : Promise.resolve(blob))
.then(fixedBlob => { blob = fixedBlob; return fixedBlob.arrayBuffer(); })
.then(arrayBuff => this.audioContext.decodeAudioData(arrayBuff))
.then(decoded => this.createPreview(decoded))
.then(preview => ({url: window.URL.createObjectURL(blob), preview: intArrayToBase64(preview)}));
*/
}
tempFixMetadata(blob, mimeType) {
const decoder = new ebml.Decoder();
const reader = new ebml.Reader();
reader.logging = true;
reader.logGroup = "Raw WebM file";
reader.drop_default_duration = false;
let webmBuf;
blob.arrayBuffer()
.then(buf => { webmBuf = buf; return decoder.decode(buf); })
.then(elms => {
elms.forEach(elm => reader.read(elm))
reader.stop();
const fixedMetadataBuf = ebml.tools.makeMetadataSeekable(reader.metadatas, reader.duration, reader.cues);
const body = webmBuf.slice(reader.metadataSize);
return new Blob([fixedMetadataBuf, body], {type: mimeType});
});
}
// Preview must be calculated at the source: Chrome does not allow background AudioContext.
+9 -5
View File
@@ -1,9 +1,11 @@
// Send message form.
import React from 'react';
import React, { Suspense } from 'react';
import { defineMessages, injectIntl } from 'react-intl';
import { Drafty } from 'tinode-sdk';
import AudioRecorder from './audio-recorder.jsx';
// Lazy-loading AudioRecorder because it's quite large due to
// a dependency on webm-duration-fix.
const AudioRecorder = React.lazy(_ => import('./audio-recorder.jsx'));
import { KEYPRESS_DELAY } from '../config.js';
import { filePasted } from '../lib/blob-helpers.js';
@@ -221,9 +223,11 @@ class SendMessage extends React.PureComponent {
{this.props.noInput ?
(quote || <div className="hr thin" />) :
(this.state.audioRec ?
<AudioRecorder
onDeleted={_ => this.setState({audioRec: false})}
onFinished={this.handleAttachAudio}/> :
(<Suspense fallback={<div>Loading...</div>}>
<AudioRecorder
onDeleted={_ => this.setState({audioRec: false})}
onFinished={this.handleAttachAudio}/>
</Suspense>) :
<textarea id="sendMessage" placeholder={prompt}
value={this.state.message} onChange={this.handleMessageTyping}
onKeyPress={this.handleKeyPress}