【问题标题】:Handling a WebRTC byte[] stream?处理 WebRTC 字节 [] 流?
【发布时间】:2016-06-01 18:22:27
【问题描述】:

我基本上是在尝试从 webrtc 流中录制音频块,我已经能够在此资源 HTML Audio Capture streaming to Node.js 的帮助下发送二进制数据。

我正在使用netty-socketio,因为这个库与客户端的 socket-io 配合得很好。 这是我的服务器端点:

server.addEventListener("audio-blob", byte[].class, (socketIOClient, bytes, ackRequest) -> {
    byteArrayList.add(bytes);
});

server.addEventListener("audio-blob-end", Object.class, (socket, string, ackRequest) -> {
    ByteArrayInputStream in = new ByteArrayInputStream(byteArrayList.getArray());
    AudioInputStream audiIn = new AudioInputStream(in, getAudioFormat(), 48000l);
    AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
    File wavFile = new File("RecordAudio.wav");
    AudioSystem.write(audiIn,fileType,wavFile);
});

格式设置:

public static AudioFormat getAudioFormat() {
    float sampleRate = 48000;
    int sampleSizeInBits = 8;
    int channels = 2;
    boolean signed = true;
    boolean bigEndian = true;
    AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits,
            channels, signed, bigEndian);
    return format;
}

我正在使用这个类来收集字节数组(是的,我知道这个解决方案的风险)

class ByteArrayList {
   private List<Byte> bytesList;

   public ByteArrayList() {
       bytesList = new ArrayList<Byte>();
   }

   public void add(byte[] bytes) {
       add(bytes, 0, bytes.length);
   }

   public void add(byte[] bytes, int offset, int length) {
       for (int i = offset; i < (offset + length); i++) {
           bytesList.add(bytes[i]);
       }
   }

   public int size(){
       return bytesList.size();
   }

   public byte[] getArray() {
       byte[] bytes = new byte[bytesList.size()];
       for (int i = 0; i < bytesList.size(); i++) {
           bytes[i] = bytesList.get(i);
       }
       return bytes;
   }
}

生成的 wav 文件只是播放噪音,没有录音。我做错了什么?

【问题讨论】:

  • 嘿,伙计,不确定您是否已接受此解决方案,但我强烈建议您使用 Kurento 之类的 WebRTC 媒体服务器来处理记录 WebRTC 流。他们有一个节点绑定库。然后,您可以使用 Twilio 进行 STUN/TURN 以确保无论网络如何,您的客户端/服务器之间的连接始终是可路由的。
  • 在开始这个项目之前我看了看 Kurento,这似乎是一个很好的 Websocket/webRTC 项目框架。我不使用 Kurento 的原因是这个概念证明有助于我理解 Websocket 和 webrtc 通信。
  • 我明白了!好吧,祝你好运。为了理解低级别的 WRTC 通信,我相信您需要了解如何通过 DTLS-SRTP 获取底层流。 DTLS 是加密底层 SRTP 流的密钥管理协议。我对堆栈中的低端了解不多,但 Janus 可能是一个了解它是如何用 C 编写的好地方:github.com/meetecho/janus-gateway

标签: node.js audio socket.io webrtc


【解决方案1】:

当 Google:四处寻找答案时,我偶然发现了这个资源 how to save a wav file

我做错的是我在 AudioInputstream 构造函数参数上有一个固定的大小:

new AudioInputStream(in, getAudioFormat(), 48000l)

改为:

new AudioInputStream(in, getAudioFormat(),byteArrayList.getArray().length);

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2011-07-11
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多