2016-12-11 9 views
1

Я пытаюсь создать Blob от ArrayBuffer.slice() использования, потому что мне нужно скопировать ArrayBuffer, так как я знаю, что он будет изменен в будущем (его byteLength будет 0) код которые я не контролирую/хочу изменить.Невозможно выполнить ArrayBuffer.prototype.slice на отдельных ArrayBuffer

new Blob([data2.payload.slice()], {type: "video/MP2T"}) 

И я получаю ошибку

Cannot perform ArrayBuffer.prototype.slice on a detached ArrayBuffer 

на

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 

на Windows 7 x64.

Есть ли другие способы копирования ArrayBuffer? This way not does actual copy, other ways does not seems to be pretty straightforward.

ArrayBuffer.transfer() выглядит хорошо, но их ошибки производят polyfill

Source and destination must be ArrayBuffer instances 
+0

[Получение данных BLOB из запроса XHR] (http://stackoverflow.com/questions/8022425) –

+0

@SenJacob 'new DataView (arrayBuffer)' путь не работает, поскольку он фактически ничего не копирует. – galeksandrp

ответ

1

Это моя вина, я был смущен неясного сообщение об ошибке , в этой ситуации ничего нельзя сделать, так как в момент Blob, создавая data2.payload уже есть byteLength: 0.

В то время как в обычном случае с

var from = new ArrayBuffer(0); 
var to = from.slice(); 
var to = from.slice(0); 

to будет ArrayBuffer с byteLength: 0, в данном случае это ошибка запуска, потому что перед data2.payload передается мой код он модифицируется в веб-работника, для того, чтобы избежать копирования фрагмент между основной нитью и веб-работником, data2.payload право собственности передается работнику.

+0

Как его байтовая длина установлена ​​в 0? – Kaiido

+0

ах да переводные ... Забыл об этом и да он объясняет все ваши ошибки. – Kaiido

0

Попробуйте использовать new Blob([new Uint8Array(data2.payload.slice(0))], {type: "video/MP2T"})

Смотрите в this fiddle

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "https://fiddle.jshell.net/img/logo.png", true); 
xhr.responseType = "arraybuffer"; 
xhr.onload = function(e) { 
    var binaryArray = new Uint8Array(this.response.slice(0)); // use UInt8Array for binary 
    var blob = new Blob([binaryArray], { type: "image/png" }); 
    var URL = window.URL || window.webkitURL; 
    var imageUrl = URL.createObjectURL(blob); // create url 
    document.getElementById("image").src = imageUrl; 
}; 
xhr.send(); 
+0

Пробовал, такой же результат. – galeksandrp

+0

Попробуйте использовать UInt8Array для создания Blob. Это работало для меня раньше. –

+0

Пробовал, он не копирует 'ArrayBuffer' сейчас. – galeksandrp