jsaudio缓冲区大小设置

JavaScript017

jsaudio缓冲区大小设置,第1张

缓冲区大小(Buffer Size)是JSaudio框架中常用的一种参数设置。其实,它也是所有Web音频API都必须面对的一个有效解决方案,因为它有助于提高声音的播放流畅度(Smoothness)。

缓冲区的大小是以毫秒(Millisecond)为单位的。设置更大的缓冲区,能够让 web audio API 更好的去理解和处理你的音乐文件,从而使得音乐播放更加平滑顺畅。另外,设置较小的缓冲区可以加快音乐文件的加载速度,但是会导致声音变得不够流畅。

为了获得最佳的播放效果,JSaudio缓冲区大小一般被设置为200ms到500ms之间。此外,这个缓冲区大小也要根据你要播放的文件大小和类型来进行调整。

 清空socket缓存区的数据的方法

由于socket是以数据流的形式发送数据,接收方不知道对方一次性发送了多少数据,也能保证对方一次性发送的数据能在同一刻接收到,所以Receive方法是这么工作的:

接受一个byye[]类型的参数作为缓冲区,在经过一定的时间后把接收到的数据填充到这个缓冲区里面,并且返回实际接收到数据的长度,这个实际接收到的数据长度有可能为0(没有接收到数据)、大于0小于缓冲区的长度(接收到数据,但是没有我们预期的多)、等于缓冲区的长度(说明接收到的数据大于等于我们预期的长度)。

每次接收缓冲区都用同一个byte[] byteMessage,并且你没有检查接收到的数据长度,所以第一次你接收到的数据是123456,第二次你只接收到了8,但是缓冲区里面还有23456,所以加起来就是823456了。

socket接收缓冲区的大小有讲究,设置大了接收起来慢,因为它要等尽可能多的数据接收到了再返回;设置小了需要重复多次调用接收方法才能把数据接收完,socket有个属性,标识了系统默认的接收缓冲区大小,可以参考这个!

还有就是用recv读取,但是由于不知道缓存里有多少数据,如果是阻塞模式,到最后必然等到超时才知道数据已经读取完毕,这是个问题。

另一个是用fgetc,通过返回判断是否是feof:

whlie (1) { a=fgetc(f);if (feof(f)) break;//…

b=fgetc(f);if (feof(f)) break;//…}当然,我不知道读取完毕后最后一次调用fgetc会不会堵塞,需要测试。

在非阻塞模式下,我们用recv就可以轻松搞定了,但是阻塞模式下,由于我们不知道缓冲区有多少数据,不能直接调用recv尝试清除。

使用一个小小的技巧,利用select函数,我们可以轻松搞定这个问题:

select函数用于监视一个文件描述符集合,如果集合中的描述符没有变化,则一直阻塞在这里,直到超时时间到达;在超时时间内,一旦某个描述符触发了你所关心的事件,select立即返回,通过检索文件描述符集合处理相应事件;select函数出错则返回小于零的值,如果有事件触发,则返回触发事件的描述符个数;如果超时,返回0,即没有数据可读。

重点在于:我们可以用select的超时特性,将超时时间设置为0,通过检测select的返回值,就可以判断缓冲是否被清空。通过这个技巧,使一个阻塞的socket成了‘非阻塞’socket.

现在就可以得出解决方案了:使用select函数来监视要清空的socket描述符,并把超时时间设置为0,每次读取一个字节然后丢弃(或者按照业务需要进行处理,随你便了),一旦select返回0,说明缓冲区没数据了(“超时”了)。

概述

ArrayBuffer (缓冲数组)是一种用于呈现通用、固定长度的二进制数据的类型。不能直接构造并填充 ArrayBuffer 的内容,而应该先创建一个 ArrayBufferView 对象,该对象用具体的格式来呈现 ArrayBuffer 的内容,你可以使用此对象来读写 ArrayBuffer 的内容。

方法概要

ArrayBuffer ArrayBuffer(unsigned long length)

方法

ArrayBuffer()

构造方法接收一个数字参数,作为新数组的长度,返回新创建的 ArrayBuffer 对象。

ArrayBuffer ArrayBuffer(

unsigned long length

)

参数

length

要创建的数组的大小。

返回值

新创建的 ArrayBuffer 对象,该对象具有 length 的大小,所有位置均被初始化为 0。

slice()

返回一个新的 ArrayBuffer 对象,它的内容是从当前 ArrayBuffer 的 begin 到 end 位置的备份。

负数的 begin 或 end 值指示从数组末端计数的索引。

ArrayBuffer slice(

unsigned long begin

unsigned long end Optional

)