首页 > 解决方案 > 在nodejs中使用ffmpeg上传时,edge和firefox中的sharedarraybuffer错误但在chrome中没有

问题描述

我在 React.js 中有以下代码,它使用 ffmpeg 转换文件:

import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg';

  const doTranscode = async () => {
    setMessage('Loading ffmpeg-core.js');
    await ffmpeg.load();
    setMessage('Uploading file');
    ffmpeg.FS('writeFile', filename, await fetchFile(file));
    await ffmpeg.run('-i', filename, 'test.wav');
    setMessage('Upload to manager complete. Sound file will be available and playable on the manger within 1-2 minutes.');
    const data = ffmpeg.FS('readFile', 'test.wav');
    setAudioSrc(URL.createObjectURL(new Blob([data.buffer], { type: 'audio/wav' })));

    var file_name = prompt('What would you like to call this file?');

    if (!file_name) {
      file_name = Date.now()
    }
    
    (async function(){
      let output = await getSoundID(customer_id, file_name);
      let sound_id = output.data;
      var bucket_file = new File([new Blob([data.buffer], { type: 'audio/wav' })], "sounds/" + customer_id + "/" + sound_id + ".wav");
      uploadFileToS3(bucket_file);
      updateSoundData(sound_id, customer_id);
    })();
  };

  useEffect(() => {
    if (file) {
      doTranscode()
    }
  }, [file])

上面的代码在 Chrome 中运行良好,文件已成功转换。但是,当我将它带到 Firefox 或 Edge 时,我会收到此错误Unhandled Rejection (ReferenceError): SharedArrayBuffer is not defined

我查找了这个问题,他们说我需要修改我的标题以包含以下内容:

You need to set two response headers for your document:

Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp

不知道我会如何在我的 JS 代码中这样做?

很想听听你们的想法。

标签: javascriptnode.jsreactjsffmpegcross-origin-opener-policy

解决方案


看起来根据文档,该@ffmpeg/ffmpeg库仅支持具有 SharedArrayBuffer 的浏览器:

只有支持 SharedArrayBuffer 的浏览器才能使用 ffmpeg.wasm,您可以在此处查看完整列表。

上面的列表包含从版本 79 开始的 Edge 和从版本 79 开始的 Firefox。


推荐阅读