Как получить правильные данные из файла результатов, если я использую Web Worker на ffmpeg.js? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытался использовать FFMPEG.js (https://github.com/Kagami/ffmpeg.js) для преобразования mp3-файлов на стороне браузера / клиента, и я следил за использованием страницы Web Worker. Однако работник хорошо работает на конвертации и, похоже, файл был преобразован, но я не могу получить правильные данные из файла результата.

Вот мой код:

<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> 

И вывод консоли хорошо выглядит:

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 ({имя: «output.mp3», данные: выходной файл});

Но я не могу получить данные файла результатов в outputfile , чтобы создать ссылку для загрузки BLOB-объектов.

1 Ответ

0 голосов
/ 23 апреля 2019

Вы должны прослушивать сообщение done.Что-то вроде этого будет достаточно:

case 'done':
    msg.data.MEMFS // outputs as array
    msg.data.MEMFS[0] // first output buffer
    break;
...