2016-03-29 19 views
1

Nehmen wir an, ich habe eine ArrayBuffer welche eine mp4 Datei ist. Ich möchte ein neues ArrayBuffer mit einigen zusätzlichen Bytes erstellen, die als Header-Informationen verwendet werden, und dann den mp4 Puffer im Rest des neuen ArrayBuffer speichern.Ein ArrayBuffer in einen anderen ArrayBuffer mit einem Offset lesen/schreiben/kopieren

// ... 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 

nun an diesem Punkt kann ich nicht herausfinden, wie der Inhalt von data in den neuen ab Puffer zu schreiben, so dass am Ende habe ich eine ArrayBuffer die drei Gruppen von Zahlen in der enthält Anfang, zusammen mit dem gesamten Inhalt des Videos.

Ich habe versucht, mit dem folgenden:

view.setInt32(10, data.buffer)

und obwohl ich keine Fehler kam, wurden die Daten nicht tatsächlich in den Puffer geschrieben. Ich war nicht in der Lage das Video in eine Datei zu schreiben und spielen es:

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(); 
} 

In der obigen Funktion, die alle die Zahlen, die ich abrufen richtig sind, aber wenn ich versuche, die Nutzdaten in eine Datei zu schreiben, die Datei ist die richtige Größe, aber es ist beschädigt.

file size: 5253880 
    buffer size: 5253890 
-- reading data 
first header: 29102 
second header: 18282 
third header: 576 
new file size: 5253880 

So kann ich nicht sagen, ob es falsch in der neuen ArrayBuffer gespeichert ist wird, oder ob ich den Puffer falsch bin Extrahieren - aber die test.mp4, die nicht die richtigen binären Daten enthält geschrieben wird.

+0

Kannst du nicht 'view.setInt32 (10, data)' '? und dann den neuen ArrayBuffer mit 'view.buffer' abrufen – Sachin

+0

@Sachin - Ich habe meine Frage basierend auf Ihrem Kommentar aktualisiert und kann nicht überprüfen, ob das Speichern oder Extrahieren der Daten das Problem ist. –

+0

@Sachin - falls Sie interessiert sind, wie es geht, habe ich eine Lösung gefunden. –

Antwort

5

Nach weiteren Grabungen konnte ich endlich eine funktionierende Lösung zusammensetzen. Diese erfolgreich kopiert den Inhalt der mp4ArrayBuffer in die neue ArrayBuffer, von einem Offset-(die die Header-Informationen hat):

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

Hier Ich erstelle eine Ansicht des Typs Uint8Array auf dem ArrayBuffer, die auch enthält die Kopfinformation (ab). Angabe der gleichen Größe, die ich verwendet habe, um das ArrayBuffer zu erstellen.

Mit dieser neu Ansicht erstellt habe ich dann rufen Sie die .set Funktion, der erste Parameter ist die ursprüngliche mp4ArrayBuffer, die ich auch eine Uint8Array Ansicht geben, und sagen Sie dem set Befehl von Offset 10 zu starten.

Hiermit wird der gesamte Inhalt von data zu ab von einem Offset von 10 zugewiesen.

+0

Das ist ein guter Weg, es zu tun. – Sachin