これはMediaRecorderを使って実現できますが、工夫が必要です。
再生中は4倍速で再生しつつ、ダウンロードする動画は等倍にするためのアイディアとしては、以下のアプローチがあります:
動画の再生速度(4倍)と、録画速度(1倍)は分離して考える必要があります。
そのためには以下の工夫が必要です。
これにより、画面上は速く再生されていても、録画されるファイル自体は等倍速になります。
<canvas id="viewCanvas"></canvas> <!-- 表示用 (4倍速) -->
<canvas id="recordCanvas" style="display:none;"></canvas> <!-- 録画用 (1倍速、非表示) -->
const viewCtx = document.getElementById('viewCanvas').getContext('2d');
const recordCtx = document.getElementById('recordCanvas').getContext('2d');
let audio = new Audio('your_audio.mp3');
let audioCtx = new AudioContext();
let source = audioCtx.createMediaElementSource(audio);
source.connect(audioCtx.destination);
let analyser = audioCtx.createAnalyser();
source.connect(analyser);
function drawVisualizer(ctx, analyser) {
let data = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(data);
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
// オーディオビジュアライザーを描画
for (let i = 0; i < data.length; i++) {
let barHeight = data[i] / 255 * ctx.canvas.height;
ctx.fillRect(i * 2, ctx.canvas.height - barHeight, 1, barHeight);
}
}
// 表示用Canvasは4倍速で描画
function animateView() {
drawVisualizer(viewCtx, analyser);
requestAnimationFrame(animateView);
}
// 録画用Canvasは等倍速で描画
function animateRecord() {
drawVisualizer(recordCtx, analyser);
requestAnimationFrame(animateRecord);
}
// 描画開始
animateView();
animateRecord();
// 表示用音声は4倍速で再生
audio.playbackRate = 4.0;
audio.play();
// 録画用音声は別途用意して等倍速で再生(無音でも問題なし)
// (音声が必要なければ、音声なしで録画Canvasに描画だけする)