0

OpenGL ES 2.0 を使用してバイナリ ファイルからビデオを再生する Android アプリケーションを作成しています。完全にフォーマットされていないバイナリ ピクセル データ (数千フレーム相当) を含む 1 つの大きなビデオ ファイルがあります。RandomAccessFile を使用してファイルを開き、正しいポイントに移動して、目的のフレームのピクセル データを取得しています。

私は最初、onDrawFrame の呼び出しごとにファイルを開き、再度閉じることで、これを非常に大雑把に行いました。

    //The following sits within the onDrawFrame activity:

    long time = SystemClock.uptimeMillis() % 4000L
    long frame = 0;
    frame = time/10;

    int w = 640; //width in pixels
    int h = 512; //height in pixels
    int nP = w * h; //number of pixels in frame and size of frame in bytes

    byte[] byteArray = new byte[nP]; //array to hold one frame


    try {

    RandomAccessFile f = new RandomAccessFile("//sdcard/8bitvid.bin", "r"); //open the video file

    f.seek(nP*frame);   //navigate to the correct frame
    f.read(byteArray);  //read frame
    f.close();          //close file
    }

これは多くの点で間違っていると思いますが、Labview から Java に移行したばかりで、かなりの飛躍です! だから私の質問は:

-onDrawFrame の呼び出し間でファイルを開いたままにしておくにはどうすればよいですか?

- onDrawFrame のインターレーション間で変数 (つまり、フレーム番号) を渡すにはどうすればよいですか?

簡単な説明または関連する例への単なるポインタは素晴らしいでしょう.

ありがとう

ルーク

4

1 に答える 1

0

いくつかのこと...おそらくバイナリに色情報があるので、配列の初期化にそれを含める必要があります-

  int nP = w * h *3;  // RGB = 3 bytes, RGBA = 4 bytes.

もう 1 つのことは、ondrawframe が呼び出されるたびに、ファイルを再度開くことです。これを行う必要があるのは 1 回だけです。RandomAccessFile f をレンダラー クラスのプライベート メンバーとして宣言し、コンストラクターでファイルを開くことができます。開いたままにしておくと、毎回開くことはできません。これは、実際には問題になる場合とそうでない場合があります。ただし、見たフレームの数を追跡するには、クラスでプライベート int を作成し、フレームを描画するたびにインクリメントすることをお勧めします。

だからここに私が提案するものがあります:

class glVideoRenderer implements GLSurfaceView.Renderer{
  private int frameNumber = 0;
  RandomAccessFile f;


  public glVideoRenderer(){
     try{
        f= new RandomAccessFile("//sdcard/8bitvid.bin", "r");
      }
      catch(...
  }


  public void onDrawFrame(GL10 unused){
     ..... // whatever you need here    
     f.seek(nP*frameNumber++);   //navigate to the correct frame,  frameNumber increments after the line is executed
     ....... // update whatever you need here.
  }

} 
于 2013-01-22T20:34:23.393 に答える