2016-03-29 5 views
1

ArrayBuffermp4というファイルであるとします。私はヘッダー情報として使用されるいくつかの余分なバイトを持つ新しいArrayBufferを作成し、新しいArrayBufferの残りの部分にmp4バッファーを格納したいと思います。オフセットを持つ別の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 

さて、この時点で、私は最後に私が持っているので、あること、新しいabバッファにdataの内容を書き込む方法を見つけ出すことはできませんで数字の3グループを含むArrayBufferビデオの全体の内容とともに始まります。

私は、次を使用してみました:

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

さらに掘削した後、私は最終的に実行可能な解決策をまとめることができました。この成功したコピー(ヘッダ情報を持っている)オフセットから新しいArrayBuffermp4ArrayBufferの内容は、:私も含まれていArrayBufferにタイプUint8Arrayのビューを作成しています。ここ

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

ヘッダ情報ab。私はそれを作成するために使用したのと同じサイズを指定しますArrayBuffer。その新たに作成されたビューで

、私はその後、.set関数を呼び出し、最初のパラメータには、私もがにUint8Arrayビューを提供し、オフセット10から開始するsetコマンドを伝えるmp4ArrayBufferです。

dataの内容のすべてをabにオフセット10から割り当てます。

+0

それは良い方法です。 – Sachin