2016-03-29 58 views
1

比方說,我有一個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

+0

你不能只是'view.setInt32(10,data)'?然後使用'view.buffer'獲得新的ArrayBuffer' – Sachin

+0

@Sachin - 我根據您的評論更新了我的問題,無法驗證數據的存儲或提取是否是問題。 –

+0

@Sachin - 如果您對如何完成工作感興趣,我想出了一個解決方案。 –

回答

5

經過更多挖掘,我終於能夠拼湊出一個可行的解決方案。這成功地複製mp4ArrayBuffer到新ArrayBuffer的內容,從偏移(其中有頭信息)

new Uint8Array(ab, 0, ab.byteLength).set(new Uint8Array(data), 10); 

在這裏,我在也包含ArrayBuffer創建Uint8Array類型的視圖標題信息ab。指定我用來創建ArrayBuffer的相同大小。

隨着新創建的視圖,然後我打電話.set功能,第一個參數是原始mp4ArrayBuffer這也是我給予Uint8Array視圖,並告訴set命令從偏移10開始。

這將data的所有內容從10的偏移量分配到ab

+0

這是一個很好的方式來做到這一點。 – Sachin