比方說,我有一個ArrayBuffer
這是一個mp4
文件。我想創建一個新的ArrayBuffer
,並附加幾個字節作爲標題信息,然後將mp4
緩衝區存儲在新的ArrayBuffer
的其餘部分。現在讀取/寫入/複製ArrayBuffer到另一個具有偏移量的ArrayBuffer
// ... assume the `data` variable is an existing ArrayBuffer with the contents
// of the mp4 video file.
var ab = new ArrayBuffer(10 + data.byteLength)
var view = new DataView(ab);
view.setInt32(0, 29102); // header information 1
view.setInt32(4, 18282); // header information 2
view.setInt16(8, 576); // header information 3
,在這一點上,我無法弄清楚如何的data
內容寫入新ab
的緩衝,在最後我有一個ArrayBuffer
其中包含了3組數字開始,以及視頻的全部內容。
我嘗試使用以下內容:
view.setInt32(10, data.buffer)
,雖然我沒有錯誤,數據實際上並沒有寫入緩存。我無法寫的視頻文件並播放:
function readPayload(ab) {
var view = new DataView(ab);
console.log(' first header: ' + view.getInt32(0)); // correct
console.log('second header: ' + view.getInt32(4)); // correct
console.log(' third header: ' + view.getInt16(8)); // correct
var data = new Buffer(ab.slice(10));
console.log('new file size: ' + data.byteLength); // correct length of mp4 file
var ws = fs.createWriteStream('test.mp4'); // this wrote a corrupt file
ws.write(data);
ws.end();
}
在上面的功能,都讓我找回號碼是正確的,但是當我嘗試寫的有效載荷數據到一個文件,該文件是正確的大小,但它是腐敗的。
file size: 5253880
buffer size: 5253890
-- reading data
first header: 29102
second header: 18282
third header: 576
new file size: 5253880
所以我不能告訴是否它被保存在新的ArrayBuffer
有誤,還是我錯誤地提取緩衝 - 但就是寫不包含正確的二進制數據test.mp4
。
你不能只是'view.setInt32(10,data)'?然後使用'view.buffer'獲得新的ArrayBuffer' – Sachin
@Sachin - 我根據您的評論更新了我的問題,無法驗證數據的存儲或提取是否是問題。 –
@Sachin - 如果您對如何完成工作感興趣,我想出了一個解決方案。 –