0

私はonSurfaceTextureUpdatedは私がmediaplayer.seekTo(タイムフレーム)を呼び出すたびに呼び出されていると考えて、私はtextureviewにMediaPlayerのビデオから各100ミリ秒のフレームのスクリーンショット(ビットマップ)を取得しようとしていると、ビットマップの色の設定がARGB_8888なぜMediaPlayer.seekTo()とonSurfaceTextureUpdated()がループ内で動作しないのですか?

する必要があります私はそこにビットマップを得ることができます。

public void onViewClicked() { 

    float begin = starttimeframe; // starting point of analysis in timeframe 
    float end = endtimeframe;  // ending point of analysis in timeframe 

    int f = round(begin); 
    status = 2; 
    while (f < round(end)) { 
     mediaplayer.seekTo(f); 
     currenttimeframe = f; 
     f += 100; // forward to next frame (100ms interval) 
    } 

    Toast.makeText(Extractor2Activity.this, "Done!", Toast.LENGTH_SHORT).show(); 
} 

そしてsurfacetextureは次のように更新されたときにtextureviewを取得するためのコードを追加しました::

だから私はtextureviewと、このように活動してクリック法に適用活動のボタンを作成し

public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
      Bitmap bitmap = Bitmap.createBitmap(tvWidth, tvHeight, Bitmap.Config.ARGB_8888); 
      textureView.getBitmap(bitmap); 

      File file = new File(Environment.getExternalStorageDirectory().toString(), "capture" + current timeframe + ".jpg"); 

      OutputStream fout = null; 
      try { 
       fout = new FileOutputStream(file); 
       bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout); 
       fout.flush(); 
       fout.close(); 
       MediaStore.Images.Media.insertImage(this.getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
    } 

問題は、textureviewのビデオが変更されず、onSurfaceTextureUpdatedが反復中に呼び出されないということです。

onSurfaceTextureUpdatedは()トーストメッセージは一度だけ、示された後にのみ呼び出されます。

私は解決策がなければならないと思いますが、私はAndroidのプログラミングが得意ではないんだと、これを解決する方法がわかりません。

方法seekToとonSurfaceTextureUpdatedがループしながら、適切に動作させるには? MediaMetadataRetriever.getFrameAtTimeを使用して

、それは内部が、ビットマップの色の設定は、デフォルトではRGB565さ取得ループからARGB_8888の設定の画像を取得する方法がわからない希望フレームをキャプチャすることが可能です:私はを試してみました何

getFrameAtTime。

+0

フレームがバッファするのを待ってから、それぞれの 'seekTo()'呼び出しの後にレンダリングします。 – Abbas

+0

@Abbas、クイックコメントありがとう!あなたは親切に私にいくつかのコード例を教えてもらえますか? –

答えて

0

この状況では、少し再帰的な解決策が役立ちます。コールバックのためにシークを呼び出すことで、ビットマップを取得し、さらに探索することができます。あなたがストリームの終わりに達するまで。

public void onViewClicked() { 

    viewClicked = true; 

    seekTo(round(starttimeframe)); 
} 

public void seekTo(int time) { 
    if (time < round(endtimeframe)) { 
     mediaplayer.seekTo(time); 
     currenttimeframe = time; 
    } 
    else { 
     viewClicked = false; 
    } 
} 

public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
    if (viewClicked) { 
     Bitmap bitmap = Bitmap.createBitmap(tvWidth, tvHeight, Bitmap.Config.ARGB_8888); 
     textureView.getBitmap(bitmap); 

     File file = new File(Environment.getExternalStorageDirectory().toString(), "capture" + current timeframe + ".jpg"); 

     OutputStream fout = null; 
     try { 
      fout = new FileOutputStream(file); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout); 
      fout.flush(); 
      fout.close(); 
      MediaStore.Images.Media.insertImage(this.getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     seekTo(mediaPlayer.getCurrentPosition() + 100); 
    } 
} 
+0

ありがとう@Abbas!今私は問題を解決する方法を得る! –

関連する問題