@independo/capacitor-voice-recorder
Version:
Capacitor plugin for voice recording
48 lines • 1.68 kB
JavaScript
/**
* @param {Blob | string} blob
* @returns {Promise<number>} Blob duration in seconds.
*/
export default async function getBlobDuration(blob) {
// Check for AudioContext or webkitAudioContext (Safari)
const AudioCtx = window.AudioContext || window.webkitAudioContext;
if (!AudioCtx) {
throw new Error('AudioContext is not supported in this environment.');
}
let audioContext = null;
try {
audioContext = new AudioCtx();
let arrayBuffer;
if (typeof blob === 'string') {
arrayBuffer = base64ToArrayBuffer(blob);
}
else {
arrayBuffer = await blob.arrayBuffer();
}
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
return audioBuffer.duration;
}
catch (err) {
throw new Error('Failed to get audio duration (AudioContext may require user interaction or is not supported): ' + (err instanceof Error ? err.message : String(err)));
}
finally {
if (audioContext) {
await audioContext.close();
}
}
}
/**
* Convert base64 string to ArrayBuffer.
* @param base64 The base64 string to convert.
* @returns The converted ArrayBuffer.
* @remarks This function is exported for test coverage purposes.
*/
export function base64ToArrayBuffer(base64) {
const cleanBase64 = base64.replace(/^data:[^;]+;base64,/, '');
const binaryString = atob(cleanBase64);
const bytes = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
//# sourceMappingURL=get-blob-duration.js.map