在TextureView上播放视频

时间:2012-05-24 11:23:30

标签: java android video video-streaming

在Android TextureView的文档中,它表示您可以使用TextureView播放视频: 但我似乎无法找到如何做到这一点的任何例子。有人知道吗?

我需要使用textureView,因为我想为视频制作动画。我想播放.3gp / .mp4格式的视频,而不是摄像机的视频:)

任何帮助将不胜感激..

更新:

解决方案是作为社区维基解答发布的

3 个答案:

答案 0 :(得分:43)

以下是如何做到这一点: (问题作者的解决方案,他在问题中发布了更新)

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

动画效果非常好。

答案 1 :(得分:6)

我遇到了同样的问题,用TextureView解决了这个问题。我发现setScaleXsetScaleY非常有用,如果这有助于任何人。 http://developer.android.com/reference/android/view/View.html#setScaleX%28float%29

但是,如果您只定位API 16 +:

mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);

应该这样做:)

答案 2 :(得分:-3)

您的setContentView(mPreview);需要在

之前调用
mPreview = (TextureView) findViewById(R.id.surface);
mPreview.setSurfaceTextureListener(this);