0

Je suis en train d'obtenir les screenshots (bitmaps) de chaque trame 100ms de MediaPlayer vidéo sur textureview et la configuration des couleurs du bitmap doivent être ARGB_8888Pourquoi MediaPlayer.seekTo() et onSurfaceTextureUpdated() ne fonctionnent pas dans la boucle?

Je pensais que onSurfaceTextureUpdated est appelé à chaque fois que j'appelle mediaplayer.seekTo (délai), et Je peux avoir des bitmaps là-dedans.

Je crée un bouton dans l'activité où textureview et appliquée sur la méthode de clic dans l'activité comme celui-ci:

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

Et ajouté le code pour la capture textureview lors surfacetexture mise à jour comme:

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

Le problème est que la vidéo sur textureview ne change pas et onSurfaceTextureUpdated n'est pas appelée pendant l'itération. OnSurfaceTextureUpdated() est appelée uniquement après le message Toast affiché, une seule fois.

Je suppose qu'il doit y avoir une solution, mais je ne suis pas bon à la programmation android et ne sais pas comment résoudre ce problème.

Comment faire pour seekTo et onSurfaceTextureUpdated fonctionne correctement lors de la boucle?

Ce que j'ai essayé:

En utilisant MediaMetadataRetriever.getFrameAtTime, il est possible de capturer des images souhaitées à l'intérieur des boucles, mais a acquis la configuration de couleur bitmap est RGB565 par défaut et ne savent pas comment obtenir une image de config ARGB_8888 de getFrameAtTime.

+0

Attendez que l'image soit mise en mémoire tampon, puis restituez après chaque appel 'seekTo()'. – Abbas

+0

@Abbas, merci pour le commentaire rapide! Pourriez-vous me donner un exemple de code pour ce faire? –

Répondre

0

Une petite solution récursive sera utile dans cette situation. Vous pouvez appeler chercher attendre l'appel pour obtenir votre bitmap et chercher plus loin. jusqu'à la fin du ruisseau.

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

Merci @Abbas! Maintenant, je comprends comment résoudre le problème! –