web-dev-qa-db-fra.com

Lecture de vidéo sur TextureView

Dans la documentation de Android TextureView , il est dit que vous pouvez utiliser un TextureView pour lire la vidéo: Mais je ne peux pas trouver d'exemple sur la façon de le faire. Est-ce que quelqu'un connaître?

Je dois utiliser un textureView parce que je veux animer la vidéo. Je veux lire une vidéo au format .3gp/.mp4, pas une vidéo de la caméra :)

Toute aide serait appréciée..

MISE À JOUR:

La solution est publiée en tant que réponse wiki communautaire

51
Zelleriation

Voici comment vous pouvez le faire: (solution de l'auteur de la question, qu'il a posté comme mise à jour dans la question)

Public class MediaPlayerDemo_Video extends Activity implements TextureView.SurfaceTextureListener {


 private MediaPlayer mMediaPlayer;

 private TextureView mPreview;

 @Override
 public void onCreate(Bundle icicle) {

      super.onCreate(icicle);

      mPreview = (TextureView) findViewById(R.id.surface);
      mPreview.setSurfaceTextureListener(this);
      extras = getIntent().getExtras();
      setContentView(mPreview);
 }

 @Override
 public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
 Surface s = new Surface(surface);

 try {
       mMediaPlayer= new MediaPlayer();
       mMediaPlayer.setDataSource("http://daily3gp.com/vids/747.3gp");
       mMediaPlayer.setSurface(s);
       mMediaPlayer.prepare();
       mMediaPlayer.setOnBufferingUpdateListener(this);
       mMediaPlayer.setOnCompletionListener(this);
       mMediaPlayer.setOnPreparedListener(this);
       mMediaPlayer.setOnVideoSizeChangedListener(this);
       mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
       mMediaPlayer.start();
      } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
} 

Et l'animation fonctionne vraiment bien.

46
Carlos Robles

J'ai eu le même problème et l'ai résolu avec un TextureView. J'ai trouvé setScaleX et setScaleY très utiles, si cela aide quelqu'un. http://developer.Android.com/reference/Android/view/View.html#setScaleX%28float%29

Cependant, si vous ne ciblez que l'API 16+:

mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

devrait le faire :)

6
Maximosaic