使用具有带宽控制和动态音轨切换的Node.js流音频

时间:2018-06-29 08:10:34

标签: javascript node.js audio streaming bandwidth

假设我的服务器上同一首歌曲的比特率mp3不同。 是否可以让我的节点服务器检测客户端接收数据块的速度,从而在文件之间动态切换? 例如,服务器接收到对轨道的请求,然后开始将其192kbps版本的流传输到客户端。经过几个块之后,它检测到客户端没有足够快地接收到它们,因此将数据源切换到128 kbps版本,依此类推。 目前,我只能通过简单的测试来做到这一点,但是它根本没有任何控制选项:

FirebaseDatabase.getInstance().getReference("Users")
  .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
  .addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        Empinfo q = dataSnapshot.getValue(Empinfo.class);
        q.addreport(s);
        dataSnapshot.getRef().setValue(q);
        progressBar.setVisibility(View.GONE);
        Toast.makeText(getApplicationContext(), profileImageUrl, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
});

1 个答案:

答案 0 :(得分:0)

您描述的方法通常用于视频交付中-通常使用的术语是自适应比特率(ABR)流传输。

ABR与您所描述的内容之间的主要区别在于,下一个块使用哪个比特率的决定是由客户端而不是服务器决定的。

这在实践中效果很好,因为无论如何,都是客户端在请求块,并且最好通过例如检查inout缓冲区来了解它是否可以处理更高的不速率或需要更低的速率。

您可以检查几种开源ABR实施方案,以了解它们的工作原理-如前所述,大多数是针对视频的,并且与视频相比,音频通常很小,您可能会发现它们不使用ABR进行音频但是原理是一样的。

最容易找到的视频是video.js和dash.js:

特别是,如果您查看dash.js中的ABR规则(撰写本文时为dash.js / src / streaming / rules / abr /),则有助于快速了解其实施方式-有相当多的经验和逻辑,因此您可能会发现最容易利用这种令人兴奋的东西。