Я пытался использовать 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-объектов.