Web Audio Api:通过套接字从nodejs服务器播放数据块的正确方法

Posted

技术标签:

【中文标题】Web Audio Api:通过套接字从nodejs服务器播放数据块的正确方法【英文标题】:Web Audio Api: Proper way to play data chunks from a nodejs server via socket 【发布时间】:2017-12-01 19:43:47 【问题描述】:

我正在使用以下代码从 nodejs 的套接字解​​码音频块

window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
var delayTime = 0;
var init = 0;
var audiostack = [];
var nextTime = 0;

client.on('stream', function(stream, meta)
    stream.on('data', function(data) 
        context.decodeAudioData(data, function(buffer) 
            audioStack.push(buffer);
            if ((init!=0) || (audioStack.length > 10))  // make sure we put at least 10 chunks in the buffer before starting
                init++;
                scheduleBuffers();
            
        , function(err) 
            console.log("err(decodeAudioData): "+err);
        );
    );
);

function scheduleBuffers() 
    while ( audioStack.length) 
        var buffer = audioStack.shift();
        var source    = context.createBufferSource();
        source.buffer = buffer;
        source.connect(context.destination);
        if (nextTime == 0)
            nextTime = context.currentTime + 0.05;  /// add 50ms latency to work well across systems - tune this if you like
        source.start(nextTime);
        nextTime+=source.buffer.duration; // Make the next buffer wait the length of the last buffer before being played
    ;

但它在音频块之间有一些我无法弄清楚的间隙/故障。

我还了解到,使用 MediaSource 可以执行相同的操作,并由播放器处理时间,而不是手动执行。有人可以提供一个处理 mp3 数据的例子吗?

此外,使用网络音频 API 处理实时流媒体的正确方法是什么?我已经阅读了几乎所有关于这个主题的问题,而且似乎没有一个问题没有故障。有什么想法吗?

【问题讨论】:

【参考方案1】:

可以以这段代码为例:https://github.com/kmoskwiak/node-tcp-streaming-server

它基本上使用媒体源扩展。您需要做的就是从视频更改为音频

buffer = mediaSource.addSourceBuffer('audio/mpeg');

【讨论】:

【参考方案2】:

是的@Keyne 是对的,

const mediaSource = new MediaSource()
const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg')
player.src = URL.createObjectURL(mediaSource)
sourceBuffer.appendBuffer(chunk) // Repeat this for each chunk as ArrayBuffer
player.play()

但只有在你不关心 IOS 支持的情况下才这样做? (https://developer.mozilla.org/en-US/docs/Web/API/MediaSource#Browser_compatibility)

否则请告诉我你是怎么做的!

【讨论】:

您应该对@Keyne 的答案发表评论

以上是关于Web Audio Api:通过套接字从nodejs服务器播放数据块的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 NodeJs 中的 WebAudio API

如何在没有 Web Audio API 的情况下直接从 ArrayBuffer 获取通道数据?

从 url 中提取音频片段并使用纯 Web Audio API 播放

Web Audio API:防止麦克风输入通过扬声器播放

Web Audio API 如何命名声音

Nodejs,Cloud Firestore上传任务 - 身份验证错误:错误:套接字挂起