来自WebSocket的WebAudio AAC流媒体播放
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自WebSocket的WebAudio AAC流媒体播放相关的知识,希望对你有一定的参考价值。
我需要从WebSocket播放aac(adts)流,我搜索了互联网,发现aac.js可以做到,但听起来像延迟差不多2~5秒。
我发现有些人使用WebAudio来做这件事。我尝试使用下面的代码但解码器在一些数据包之后返回错误(并不总是重复错误):
Uncaught (in promise) DOMException: Unable to decode audio data
我的示例javascript:
var context = new AudioContext();
var nextStartTime = 0;
var audioWs = new WebSocket("ws://" + hostip + ":8084");
audioWs.binaryType = 'arraybuffer';
audioWs.onopen = function(evt) {
console.log("onOpen");
bexit = 0;
};
audioWs.onclose = function(evt) {
console.log("close");
};
audioWs.onmessage = function(evt) {
var blob = evt.data;
if ( blob.slice == undefined) {
console.log("undefined message");
return;
}
decodeAudio(blob);
};
audioWs.onerror = function(evt) {
console.log("error");
};
var decodeAudio = function(blob) {
context.decodeAudioData(
blob,
function(buffer) {
if (!buffer) {
console.log('error decoding file data: ' + url);
return;
}
console.log("playback buffer");
playBuffer(buffer);
},
function(error) {
console.error("decodeAudioData error", error);
});
};
var playBuffer = function(buffer) {
var source = context.createBufferSource();
source.buffer = buffer;
if(nextStartTime == 0){
nextStartTime = context.currentTime + buffer.duration/2;
}
source.connect(context.destination);
source.start(nextStartTime);
nextStartTime += buffer.duration;
};
我不确定它是否是由websocket收到的数据过快导致解码器错误造成的!我该如何解决?
或者使用WebAudio API执行此任务可能不是一个好方法?
答案
WebAudio的decodeAudioData
无法解码部分blob。一般而言,它需要整个文件,因为在许多编码格式中,必要的信息(采样率,通道,样本大小等)仅在开始时。
以上是关于来自WebSocket的WebAudio AAC流媒体播放的主要内容,如果未能解决你的问题,请参考以下文章
带有fetch的WebAudio流:DOMException:无法解码音频数据