2017-08-05 8 views
2

私はバイナリファイルの一部として圧縮オーディオデータを含むDart Webアプリケーションにバイナリファイルをロードしています。データがhttpリクエスト経由でロードされると、ByteBufferとして送られます。これは、JS ArrayBufferの代わりにDartのものです。 AudioContext.decodeAudioData()メソッドはByteBufferを必要とし、ロードされたByteBufferの関連するセクションをどのように与えるかを調べようとしています。ロードされたByteBufferには、オーディオに関連しない追加のデータが含まれます。 JSのArrayBuffersはslice()メソッドをサポートしていますが、これはByteBufferクラスにはありません。範囲選択を許可するリストに変換した後、ByteBufferに戻る方法はありません。既存のByteBufferの領域から新しいDart ByteBuffer?

私はraw JSでハイブリッドソリューションを作成できると思っていますが、可能であればこれをDartに残したいと思います。アイデアが評価されました!

答えて

0
私は範囲選択を可能にする にリストのいずれかを変換した後に戻ったByteBufferを取得する方法を参照することはできません

あり、その周りにいくつかの方法がありますが、あなた以来オリジナルのバッファを変更したい(私は推測)、あなたの周りに、その後数バイトをコピーしますしません。

// extract 2 ints (8 bytes) - no copying done yet 
var rangeIterable = buffer.asInt32List().getRange(8, 10); 

// create new typed list (copies the bytes from the iterable) 
var newList = new Int32List.fromList(rangeIterable); 
var newBuffer = newList.buffer; 

print(buffer.lengthInBytes); 
print(newBuffer.lengthInBytes); 
+1

ありがとうございました!これに加えて、toList()はInt32List.fromList()で動作するにはrangeIterableで呼び出される必要があります。新しいInt32Listを作成するときにバッファプロパティにデータが移入されることはありません。元のデータを参照していることに慣れてきましたが、コピーされたデータを表すことは当然です。 –

+0

本当に '.toList()'を追加する必要がありましたか?それは私がそれをローカルで試してみたときのように働いていたので(強いモードなしで、それは)。 – rinukkusu

+1

私はそう信じています。それは私がそれなしでそれを試したとき私に型変換エラーを与えていた。 "タイプ 'SubListIterable 'は 'List'タイプのサブタイプではありません" Intellijから起動したDartiumでテストしていますが、デフォルトではチェックモードが有効になっている可能性があります。 –

1

ダートByteBufferはスライス法を持っていません。 Uint8Listを徹底的に調べることができるので、buffer.slice(a, b)の代わりにbuffer.asUint8List().sublist(a, b).bufferを実行します。型付きデータリストのsublistメソッドは、新しいバッファでサポートされている同じ型のリストを返します。bufferゲッターは、型付きデータリストの基になるバッファを返します。 sliceはバッファ上に直接描画されているものではありませんが、アラインメントの問題なしにジョブが完了します(Int32Listは開始オフセットが4バイト境界である必要があるため、任意のカッティングでは常に8ビットリスト)。

+0

ありがとう!これは簡潔な方法であり、1バイトのリストタイプを選択することの良い点です。 –

関連する問題