Scala在过滤不可变序列方面非常优雅:
var l = List(1,2,3,4,5,6)
l = l.filter(_%2==1)
Run Code Online (Sandbox Code Playgroud)
但是我如何使用像ArrayBuffer这样的可变集合呢?我发现的只是删除单个元素或切片,或从另一个序列中删除元素,但没有删除谓词给出的元素.
编辑:我希望找到类似的东西:
trait Removable[A] extends Buffer[A]{
def removeIf(p: A => Boolean){
var it1 = 0
var it2 = 0
while(it2 < length){
if( p( this(it2) ) ){
it2 += 1;
}
else {
this(it1) = this(it2)
it1 += 1;
it2 += 1;
}
}
trimEnd(it2-it1)
}
}
Run Code Online (Sandbox Code Playgroud)
这个过滤器在线性时间内可以混合到任何缓冲区中,但只有ArrayBuffer才有意义,在ListBuffers上它会很慢,因为索引确实需要线性时间.
我在这里有点困惑.ArrayBuffer为它分配一个新的内存区域吗?如果是这样,那么安全的最大Blob大小是什么?
有没有办法读取文件的原始文件内容,并使用XMLHttpRequest ajax请求将二进制数据发送到服务器?在HTML5浏览器中,我可以这样做:
reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function(e) {
xhr.send(e.target.result);
}
Run Code Online (Sandbox Code Playgroud)
有一些库,如FileAPI或FileReader polyfill,但它们都不支持readAsArrayBuffer(),如果我使用readAsBinaryString()二进制数据将在转换为String时被搞砸,并且额外的字符将被添加到内容中.
有什么建议?
我有一组声音样本(16 位):
[0, 120, 320, 120, 0, -100, -30000, 65, 2, 3, 10, ...]
Run Code Online (Sandbox Code Playgroud)
它们的范围是 -32768 到 32767。我希望能够使用 Web Audio API 播放样本。
我知道它希望源缓冲区是一个ArrayBuffer,但我无法弄清楚如何将一堆样本转换ArrayBuffer为要使用 Web Audio API 播放的 。
有小费吗?
我正在尝试从 ArrayBuffers 块创建图像文件。
all= fs.createWriteStream("out."+imgtype);
for(i=0; i<end; i++){
all.write(picarray[i]);
}
all.end();
Run Code Online (Sandbox Code Playgroud)
其中picarray包含 ArrayBuffer 块。但是,我收到错误
TypeError: Invalid non-string/buffer chunk。
如何将 ArrayBuffer 块转换为图像?
在下面的代码中,console.log(sb.buffered) 给了我一个长度为 0 的 TimeRanges 对象。这是为什么?我检查了 xhr.response 是什么,它是一个大约 58000 byteLength 的 ArrayBuffer。
var ms;
var sb;
var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
function example() {
ms = new MediaSource;
var video = document.querySelector('video');
video.src = URL.createObjectURL(ms);
ms.addEventListener('sourceopen', function() {
sb = ms.addSourceBuffer(mimeCodec);
fetch('test0.mp4');
}, false);
}
function fetch(url) {
var xhr = new XMLHttpRequest;
xhr.open('get', url);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
if (ms.readyState === 'open') {
sb.appendBuffer(xhr.response);
sb.addEventListener('updateend', function() {
console.log(sb.buffered);
});
}
};
xhr.send();
}
Run Code Online (Sandbox Code Playgroud) javascript xmlhttprequest html5-video arraybuffer media-source
我将ordered set设置为true,但是如果在短时间内(<1秒)发送了许多(1000或更多)消息,则收到的消息不会以相同的顺序接收.
rtcPeerConnection.createDataChannel("app", {
ordered: true,
maxPacketLifeTime: 3000
});
Run Code Online (Sandbox Code Playgroud)
如果需要,我可以提供一个最小的例子来重现这种奇怪的行为.
我还使用bufferedAmountLowThreshold和相关事件来延迟发送缓冲量太大.我选择2000但我不知道最佳数字是多少.我在短时间内收到如此多邮件的原因是因为我不想溢出一次发送的最大数据量.所以我将数据分成800字节包并发送.我再次不知道1条消息的最大大小是多少.
const SEND_BUFFERED_AMOUNT_LOW_THRESHOLD = 2000; //Bytes
rtcSendDataChannel.bufferedAmountLowThreshold = SEND_BUFFERED_AMOUNT_LOW_THRESHOLD;
const MAX_MESSAGE_SIZE = 800;
Run Code Online (Sandbox Code Playgroud)
对于未分成太多消息的小数据,一切正常.仅对大文件随机发生错误.
我需要在一个请求中将图像数据(读取为数组缓冲区)以及页面生成的其他字符串/json 信息发送到 NodeJS 服务器。我需要在一个请求中处理这两个部分,因为服务器的进一步图像处理取决于一起发送的字符串/json。有什么方法既可以通过客户端发送这些内容,又可以通过服务器解析它们以符合这些标准?
服务器将视频作为 arrayBuffers 发送并使用 websockets 将它们流式传输到客户端。在客户端,我实时接收 arrayBuffers。那么,有没有办法通过 HTML5 视频标签使用这些 arrayBuffers 启动视频流?
数组缓冲区示例:
我正在构建一个在Ocaml中实现并使用编译为JavaScript的JavaScript库js_of_ocaml.
我的一个Ocaml函数返回string带有二进制数据的函数.我怎么可以公开使用js_of_ocaml的ArrayBuffer?
arraybuffer ×10
javascript ×8
filereader ×2
node.js ×2
audio ×1
buffer ×1
file ×1
fileapi ×1
flash ×1
html5-video ×1
js-of-ocaml ×1
media-source ×1
ocaml ×1
scala ×1
stream ×1
string ×1
webrtc ×1
websocket ×1