v76: проигрывание через trimSilence — без щелчка в начале

This commit is contained in:
“Naeel”
2026-05-22 21:37:10 +04:00
parent 66a3e32c03
commit 337f7f3017
3 changed files with 50 additions and 42 deletions
+21 -10
View File
@@ -90,22 +90,33 @@ function stopRecording() {
if (mediaRecorder && mediaRecorder.state === 'recording') mediaRecorder.stop();
}
// ---------- Воспроизведение ----------
// ---------- Воспроизведение (с обрезкой тишины) ----------
async function playTrimmed(blob) {
const t = await trimSilence(blob);
const ctx = getAudioCtx();
let buf;
if (t) {
const offline = new OfflineAudioContext(1, t.data.length, t.sr);
buf = offline.createBuffer(1, t.data.length, t.sr);
buf.getChannelData(0).set(t.data);
} else {
const ab = await blob.arrayBuffer();
buf = await ctx.decodeAudioData(ab);
}
const src = ctx.createBufferSource();
src.buffer = buf;
src.connect(ctx.destination);
src.start();
return new Promise(resolve => { src.onended = resolve; });
}
async function playRec(id) {
try {
const db = await openRecDB();
const tx = db.transaction('recs', 'readonly');
const store = tx.objectStore('recs');
const rec = await new Promise(r => { const req = store.get(id); req.onsuccess = () => r(req.result); });
if (rec?.blob) {
const url = URL.createObjectURL(rec.blob);
const audio = new Audio(url);
await new Promise((resolve, reject) => {
audio.onended = () => { URL.revokeObjectURL(url); resolve(); };
audio.onerror = () => { URL.revokeObjectURL(url); reject(); };
audio.play();
});
}
if (rec?.blob) await playTrimmed(rec.blob);
} catch(e) { /* тихо */ }
}