是否可以在浏览器中使用纯JavaScript保存音频流?

时间:2016-05-19 01:41:20

标签: javascript audio ffmpeg stream

我想创建一个网页,访问者可以通过点击链接(不是实时流,但是使用流的无线电档案中的链接)来保存音频流,我希望这样做,而不需要使用纯JavaScript的服务器后端浏览器。 我在某处读到了FFMpeg的JavaScript端口,它可以利用所谓的blob在浏览器中编码和保存视频/音频。但是下载库是巨大的,据我记得17 MB。实际上我只需要流复制音频流,而不是真正的编码过程。 我通常使用类似的命令来保存程序:

ffmpeg -i http://stream.example.com/stream_20160518_0630.mp3 -c copy -t 3600 programme.mp3

我想知道,是否有可能将FFMpeg的一个子集编译成JavaScript,它只提供真正需要的流复制?

1 个答案:

答案 0 :(得分:1)

var audio = new Audio();
var ms = new MediaSource();
var chunks = [];
audio.src = URL.createObjectURL(ms);

ms.addEventListener('sourceopen', function(e) {
    var sourceBuffer = ms.addSourceBuffer('audio/mpeg');
    var stream;

    function pump(stream){
        return stream.read().then(data => {
            chunks.push(data.value)

            sourceBuffer.appendBuffer(data.value);
        })
    };

    sourceBuffer.addEventListener('updateend', () => {
        pump(stream);
    }, false);

    fetch("http://stream001.radio.hu:443/stream/20160606_090000_1.mp3")
        .then(res=>pump(stream = res.body.getReader()))

    audio.play()
}, false);

// stop the stream when you want and save all chunks that you have
stopBtn.onclick = function(){
    var blob = new Blob(chunks)
    console.log(blob)
    // Create object url, append to link, trigger click to download
    // or saveAs(blob, 'stream.mp3') need: https://github.com/eligrey/FileSaver.js
}