首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果在ffmpeg.js上使用Worker,如何获得正确的结果文件数据?

如果在ffmpeg.js上使用Worker,如何获得正确的结果文件数据?
EN

Stack Overflow用户
提问于 2019-04-04 08:36:12
回答 1查看 1.5K关注 0票数 0

我尝试使用FFMPEG.js (https://github.com/Kagami/ffmpeg.js)在浏览器/客户端转换mp3文件,并遵循Worker页面的用法。但是,工作人员在转换方面工作得很好,而且文件似乎已经转换,但我无法获得正确的结果文件数据。

这里我的代码是:

代码语言:javascript
运行
复制
<html>
<body>
<script>

var stdout = "";
var outputhtml="";
var stderr = "";
var outputfile;

var sampleVideoData;

function retrieveSampleVideo() {
  var oReq = new XMLHttpRequest();
  oReq.open("GET", "short.mp3", true);
  oReq.responseType = "arraybuffer";

  oReq.onload = function (oEvent) {
    var arrayBuffer = oReq.response;
    if (arrayBuffer) {
      sampleVideoData = new Uint8Array(arrayBuffer);
    }
  };

  oReq.send(null);
}

function getDownloadLink(fileData, fileName) {
  var a = document.createElement('a');
  a.download = fileName;
  var blob = new Blob([fileData]);
  var src = window.URL.createObjectURL(blob);
  a.href = src;
  a.textContent = 'Click here to download ' + fileName + "!";
  document.body.appendChild(a);
}

var worker = new Worker("ffmpeg-worker-mp4.js");

retrieveSampleVideo();

var memfs =[];  

//[, {name: "input.mp3", data: output}];

worker.onmessage = function(e) {
  var msg = e.data;

  switch (msg.type) {
  case "ready":
    console.log("ready: " + msg.data);
    alert(sampleVideoData.length);
    memfs.push({name: "input.mp3", data: sampleVideoData});
    memfs.push({name: "output.mp3", data: outputfile});

    worker.postMessage({type: "run", MEMFS: memfs, arguments: ["-i", "input.mp3", "-y", "output.mp3"]});


    break;
  case "stdout":
    console.log("stdout: " + msg.data);
    stdout += msg.data + "\n";
    outputhtml+=msg.data + "<br>";

    break;
  case "stderr":
    console.log("stderr: " + msg.data);
    stderr += msg.data + "\n";
    outputhtml+=msg.data + "<br>";

    break;

  case "exit":

    console.log("Process exited with code " + msg.data);
    console.log(stdout);
    document.write(outputhtml);

    getDownloadLink(outputfile, "output.mp3");
    worker.terminate();


    break;
  }
};

    </script>

</body>
</html> 

控制台输出看起来很好:

代码语言:javascript
运行
复制
stderr: ffmpeg version n3.1.2 Copyright (c) 2000-2016 the FFmpeg developers index.html:66:4
stderr:   built with emcc (Emscripten gcc/clang-like replacement) 1.36.7 () index.html:66:4
stderr:   configuration: --cc=emcc --enable-cross-compile --target-os=none --arch=x86 --disable-runtime-cpudetect --disable-asm --disable-fast-unaligned --disable-pthreads --disable-w32threads --disable-os2threads --disable-debug --disable-stripping --disable-all --enable-ffmpeg --enable-avcodec --enable-avformat --enable-avutil --enable-swresample --enable-swscale --enable-avfilter --disable-network --disable-d3d11va --disable-dxva2 --disable-vaapi --disable-vda --disable-vdpau --enable-decoder=vp8 --enable-decoder=vp9 --enable-decoder=theora --enable-decoder=mpeg2video --enable-decoder=mpeg4 --enable-decoder=h264 --enable-decoder=hevc --enable-decoder=png --enable-decoder=mjpeg --enable-decoder=vorbis --enable-decoder=opus --enable-decoder=mp3 --enable-decoder=ac3 --enable-decoder=aac --enable-decoder=ass --enable-decoder=ssa --enable-decoder=srt --enable-decoder=webvtt --enable-demuxer=matroska --enable-demuxer=ogg --enable-demuxer=avi --enable-demuxer=mov --enable-demuxer=flv --enable-demuxer=mpegps --enable-demuxer=image2 --enable-demuxer=mp3 --enable-demuxer=concat --enable-protocol=file --enable-filter=aresample --enable-filter=scale --enable-filter=crop --enable-filter=overlay --disable-bzlib --disable-iconv --disable-libxcb --disable-lzma --disable-sdl --disable-securetransport --disable-xlib --disable-zlib --enable-encoder=libx264 --enable-encoder=libmp3lame --enable-encoder=aac --enable-muxer=mp4 --enable-muxer=mp3 --enable-muxer=null --enable-gpl --enable-libmp3lame --enable-libx264 --extra-cflags=-I../lame/dist/include --extra-ldflags=-L../lame/dist/lib index.html:66:4
stderr:   libavutil      55. 28.100 / 55. 28.100 index.html:66:4
stderr:   libavcodec     57. 48.101 / 57. 48.101 index.html:66:4
stderr:   libavformat    57. 41.100 / 57. 41.100 index.html:66:4
stderr:   libavfilter     6. 47.100 /  6. 47.100 index.html:66:4
stderr:   libswscale      4.  1.100 /  4.  1.100 index.html:66:4
stderr:   libswresample   2.  1.100 /  2.  1.100 index.html:66:4
stderr: [mp3 @ 0x812380] Warning: not compiled with thread support, using thread emulation index.html:66:4
stderr: Input #0, mp3, from 'input.mp3': index.html:66:4
stderr:   Metadata: index.html:66:4
stderr:     encoder         : Lavf57.66.101 index.html:66:4
stderr:   Duration: 00:00:03.02, start: 0.023021, bitrate: 128 kb/s index.html:66:4
stderr:     Stream #0:0: Audio: mp3, 48000 Hz, stereo, s16p, 128 kb/s index.html:66:4
stderr:     Metadata: index.html:66:4
stderr:       encoder         : Lavc57.75 index.html:66:4
stderr: [mp3 @ 0x8240f0] Warning: not compiled with thread support, using thread emulation index.html:66:4
stderr: [libmp3lame @ 0x81b8a0] Warning: not compiled with thread support, using thread emulation index.html:66:4
stderr: [mp3 @ 0x80b0f0] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead. index.html:66:4
stderr: Output #0, mp3, to 'output.mp3': index.html:66:4
stderr:   Metadata: index.html:66:4
stderr:     TSSE            : Lavf57.41.100 index.html:66:4
stderr:     Stream #0:0: Audio: mp3 (libmp3lame), 48000 Hz, stereo, s16p index.html:66:4
stderr:     Metadata: index.html:66:4
stderr:       encoder         : Lavc57.48.101 libmp3lame index.html:66:4
stderr: Stream mapping: index.html:66:4
stderr:   Stream #0:0 -> #0:0 (mp3 (native) -> mp3 (libmp3lame)) index.html:66:4
stderr: Press [q] to stop, [?] for help index.html:66:4
stderr: size=      47kB time=00:00:03.00 bitrate= 129.6kbits/s speed=10.9x    index.html:66:4
stderr: video:0kB audio:47kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.489831% index.html:66:4
Process exited with code 0

我已经将输出设置为代码中的memfs:

memfs.push({name:"output.mp3",data: outputfile});

但我无法获得outputfile中的结果文件数据来创建blob链接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-23 17:09:14

您应该监听done消息。这样的东西就足够了:

代码语言:javascript
运行
复制
case 'done':
    msg.data.MEMFS // outputs as array
    msg.data.MEMFS[0] // first output buffer
    break;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55511382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档