我目前正在一个小型项目中,我想将一个mp3分成帧,通过websocket发送给客户端(浏览器),然后使用WebAudio播放它们webkitAudioContext)。我的服务器正在运行nodejs并以二进制形式传输数据,我使用binaryJS。我正在测试的浏览器是在Ubuntu 12.04上运行的Chrome 25.0.1354.0 dev。DOM异常12当试图通过websocket流式传输MP3
我已经得到尽可能成功地将MP3分成帧,或者至少,根据我的测试,它似乎工作。如果我将帧写回到文件中,mplayer在播放文件时没有问题,并且也能正确解析标题。每个帧存储在正确大小的nodejs缓冲区中,并且缓冲区的最后一个字节始终是下一个同步字符之前的第一个字节。
作为初步测试,我只发送第一个MP3帧。客户端成功接收帧(存储在ArrayBuffer中),并且缓冲区包含正确的数据。然而,当我打电话解码,我得到以下信息:
Uncaught Error: SyntaxError: DOM Exception 12
我的功能,在这里我呼吁decodeAudio,看起来是这样的:
streamDone = ->
bArray = new Uint8Array(arr[0].byteLength)
console.log "Stream is done, bytes", bArray.length
context.decodeAudioData bArray, playAudio, err
,我想deocde最初的框架,可以被发现here。
为了解决这个问题,我一直在墙上敲了几下头。有没有人设法解决这个和成功解码的MP3帧,看看我做错了什么?我在StackOverflow上发现了两个相关的问题,但答案并没有帮助我解决问题。但是,根据接受的答案here,我的帧应该被视为有效的MP3块,并因此被解码。
在此先感谢您的帮助!
我做了一些更小的文件测试,没有ID3标签。将帧写入磁盘时,新文件与原始文件具有相同的md5散列值。当我将所有帧发送到服务器时,它们都适合一个binaryJS块,并且ArrayBuffer的内容与该文件相匹配。我仍然得到DOM异常。 –