ByteArray.readBytes と ByteArray.writeBytes

その前に FLVの分割方法を調べ中 の続き。

前回書いた通り、

  1. 適当な長さのByteArrayからキーフレームを探し出して
  2. キーフレームになっている FLV Tag(Video) から、終わりにしたい場所にあるキーフレームの直前の FLV Tag までを抜き出して
  3. 抜き出してきたByteArrayの先頭にFLV Header(46 4C 56 01 05 00 00 00 09) + FLV Stream(00 00 00 00)を書き足して
  4. ファイルに書き出し。

という感じで動くものができあがりました。

1つのFLVを4つくらいに分割したすると、2つ目の分割ByteArray以降は 2. の処理の後に FLV Tag のtimestamp(再生開始ミリ秒)の値を書き換える処理が入るくらいです。

今後の課題:

FLV Tag(Meta) を生成して、分割したファイルそれぞれに入れるようにする。

メモリの使い方をもうちょっと考えてコードを修正する。

分割されているファイルを1つに結合する処理も作る。

対応ファイルフォーマットを増やす。


で、これを書いているときに readBytes とか writeBytes をたくさん使いまして、ごちゃごちゃやっているうちに軽く混乱したのでまとめておきます。

var data:ByteArray = new ByteArray();
data.writeInt(0xAABBCCDD);
data.position = 0;
var ba:ByteArray = new ByteArray();

こういうコードがあったとして、data の値を ba にコピーしたいときに

data.readBytes(ba);

または

ba.writeBytes(data);

でコピーできます。

それでなんですが、このときにどちらを使うかをさして意識せずに使っているうちに data.position や ba.position の値の変わり方に混乱してしまいました。

data.readBytes(ba);  //data.position 変わる。 ba.position 変わらない。
ba.writeBytes(data);  //ba.position 変わる。 data.position 変わらない。

ちょっと落ち着いて考えれば、メソッドを持っているオブジェクトのpositionプロパティが変わるのはそうだよなと納得できますし、引数の方も省略なしの ByteArray.xxxBytes(bytes:ByteArray, offset:uint=0, length:uint=0) を眺めれば変わらないだろうなと予測できるんですけどね。

今後は気にしながら書くのでもう大丈夫だと思いますが、また混乱とか勘違いしながら書いてたらバグる!ということでメモしておきます。

コメントを残す