【发布时间】:2020-02-13 09:52:54
【问题描述】:
在 Unity3D 中实时捕获 PCM 音频数据。所有这些数据都将通过 WebSockets 流式传输到 HTML。一般设置是 Socket.IO 和 node.js 服务器。
我的主要任务是为所有平台上的实时视频+音频流解决方案添加流畅的音频播放。这是我的工作进度(视频流):https://youtu.be/82_-a7WF3vs
音频和视频流部分在非 html/非 WebGL 平台上运行良好。
但是,我无法使用 javascript 在 html 上进行流畅的音频播放。它是实时运行的,但我发现了一些滞后的问题,比如噪音...... 我担心的一个问题是 Web 浏览器不支持多线程,它在同时接收流数据和播放时增加了一些延迟。
以下是我的 PCM 播放核心脚本。希望有人可以帮助我改进它。
var startTime = 0;
var audioCtx = new AudioContext();
function ProcessAudioData(_byte) {
ReadyToGetFrame_aud = false;
//read meta data
SourceSampleRate = ByteToInt32(_byte, 0);
SourceChannels = ByteToInt32(_byte, 4);
//conver byte[] to float
var BufferData = _byte.slice(8, _byte.length);
AudioFloat = new Float32Array(BufferData.buffer);
//=====================playback=====================
if(AudioFloat.length > 0) StreamAudio(SourceChannels, AudioFloat.length, SourceSampleRate, AudioFloat);
//=====================playback=====================
ReadyToGetFrame_aud = true;
}
function StreamAudio(NUM_CHANNELS, NUM_SAMPLES, SAMPLE_RATE, AUDIO_CHUNKS) {
var audioBuffer = audioCtx.createBuffer(NUM_CHANNELS, (NUM_SAMPLES / NUM_CHANNELS), SAMPLE_RATE);
for (var channel = 0; channel < NUM_CHANNELS; channel++) {
// This gives us the actual ArrayBuffer that contains the data
var nowBuffering = audioBuffer.getChannelData(channel);
for (var i = 0; i < NUM_SAMPLES; i++) {
var order = i * NUM_CHANNELS + channel;
nowBuffering[i] = AUDIO_CHUNKS[order];
}
}
var source = audioCtx.createBufferSource();
source.buffer = audioBuffer;
source.connect(audioCtx.destination);
source.start(startTime);
startTime += audioBuffer.duration;
}
【问题讨论】:
标签: javascript unity3d video-streaming streaming audio-streaming