MediaRecorder を使った動画の録画において、再生時は4倍速で動画を再生しつつ、ダウンロードする動画自体は等倍とするアイディアはありますか?

これはMediaRecorderを使って実現できますが、工夫が必要です。

再生中は4倍速で再生しつつ、ダウンロードする動画は等倍にするためのアイディアとしては、以下のアプローチがあります:

基本方針

動画の再生速度(4倍)と、録画速度(1倍)は分離して考える必要があります。

そのためには以下の工夫が必要です。

これにより、画面上は速く再生されていても、録画されるファイル自体は等倍速になります。


実装の流れ

① Canvasを2つ用意

<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に描画だけする)