ffmpegJsCode property

String ffmpegJsCode
getter/setter pair

Implementation

static String ffmpegJsCode = r"""
let ffmpegInstance;

async function initFFmpegOnce() {
if (ffmpegInstance && ffmpegInstance.isLoaded()) return ffmpegInstance;

if (!window.FFmpeg) {
  throw new Error("FFmpeg not loaded");
}

const { createFFmpeg } = FFmpeg;
ffmpegInstance = createFFmpeg({ log: false });

try {
  await ffmpegInstance.load();
} catch (error) {
  console.error("ffmpeg.load() failed", error);
  throw error;
}

return ffmpegInstance;
}

window.convertWavToM4a = async function (
wavBytesBase64,
inputFileName = "input.wav",
callback
) {


try {
  console.error("window.crossOriginIsolated", window.crossOriginIsolated);
  const ffmpeg = await initFFmpegOnce();
  const wavBytes = Uint8Array.from(atob(wavBytesBase64), (c) =>
    c.charCodeAt(0)
  );

  ffmpeg.FS("writeFile", inputFileName, wavBytes);

  const outputFileName = inputFileName.replace(/\.\w+$/, ".m4a");

  await ffmpeg.run(
    "-i",
    inputFileName,
    "-c:a",
    "aac",
    "-b:a",
    "128k",
    outputFileName
  );

  const m4aBytes = ffmpeg.FS("readFile", outputFileName);

  const m4aBase64 = btoa(
    Array.from(m4aBytes)
      .map((b) => String.fromCharCode(b))
      .join("")
  );
  callback(m4aBase64);
} catch (error) {
  console.error("catch.load()", error);
  callback(null);
}
};

""";