分享

MediaPlayer 用法(一) - 一切皆有可能 - JavaEye技术网站

 software1 2010-11-09
2010-10-20

MediaPlayer 用法(一)

文章分类:移动开发

使用SurfaceView播放视频,其实很简单,但是经常会碰见有声音没图像的问题.

其实使用SurfaceView播放视频只需要主要下面几个地方就可以了

 

1. surfaceChanged也就是Suface是否创建成功

2. onPrepared 也就是MideoPlayer是否加载并准备完成

3. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

类型必须是SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS


Java代码
  1. package VideoTest.Test;  
  2.   
  3. import java.io.FileDescriptor;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.res.AssetFileDescriptor;  
  7. import android.media.AudioManager;  
  8. import android.media.MediaPlayer;  
  9. import android.media.MediaPlayer.OnBufferingUpdateListener;  
  10. import android.media.MediaPlayer.OnCompletionListener;  
  11. import android.media.MediaPlayer.OnPreparedListener;  
  12. import android.os.Bundle;  
  13. import android.view.SurfaceHolder;  
  14. import android.view.SurfaceView;  
  15.   
  16.   
  17. public class VideoTest extends Activity implements SurfaceHolder.Callback,   
  18.     OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener{  
  19.       
  20.     private SurfaceView surfaceView;  
  21.     private SurfaceHolder surfaceHolder;  
  22.     private MediaPlayer mediaPlayer;  
  23.       
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.           
  28.         this.surfaceView = new SurfaceView(this);  
  29.         this.surfaceHolder = this.surfaceView.getHolder();  
  30.         this.surfaceHolder.addCallback(this);  
  31.           
  32.         //类型必须设置成SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS  
  33.         this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);      
  34.         setContentView(this.surfaceView);  
  35.     }  
  36.       
  37.     @Override  
  38.     public void onDestroy() {  
  39.         super.onDestroy();  
  40.         if (this.mediaPlayer != null) {  
  41.             this.mediaPlayer.release();  
  42.             this.mediaPlayer = null;  
  43.         }  
  44.     }  
  45.       
  46.     public void PlayVideo(){  
  47.           
  48.         try {  
  49.             //视频文件放在 assert中  
  50.             AssetFileDescriptor aFD = this.getAssets().openFd("welcome.3gp");  
  51.             FileDescriptor fileDescriptor = aFD.getFileDescriptor();  
  52.             this.mediaPlayer = new MediaPlayer();  
  53.             this.mediaPlayer.setDataSource(fileDescriptor, aFD.getStartOffset(), aFD.getLength());  
  54.             aFD.close();      
  55.               
  56.             //视频放在SDCard中  
  57.             //File sdFile = Environment.getExternalStorageDirectory();  
  58.             //this.mediaPlayer = new MediaPlayer();  
  59.             //this.mediaPlayer.setDataSource(sdFile.getAbsoluteFile() + File.separator + "welcome.3gp");  
  60.               
  61.             //视频放在res中  
  62.             //this.mediaPlayer = MediaPlayer.create(this, R.raw.welcome);  
  63.               
  64.             //网上的视频,没有测试  
  65.             //this.mediaPlayer  
  66.             //  .setDataSource("http://xy2.163.com/download/down/wukong.mp3");  
  67.               
  68.             this.mediaPlayer.setDisplay(this.surfaceHolder);  
  69.             this.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  70.             //准备完成后才可以播放,另外如果文件特别大或者从网上获得的资源  
  71.             //会在这里等待时间过长,造成堵塞,这样的话就得用  
  72.             //this.mediaPlayer.prepareAsync(),然后监听是否准备完毕在开始  
  73.               
  74.             this.mediaPlayer.prepare();           
  75.             this.mediaPlayer.start();                 
  76.                   
  77.         } catch (Exception e) {  
  78.             // TODO: handle exception  
  79.         }  
  80.     }  
  81.       
  82.     @Override  
  83.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  84.             int height) {  
  85.           
  86.     }  
  87.   
  88.     @Override  
  89.     public void surfaceCreated(SurfaceHolder holder) {  
  90.         //SurfaceCreated 创建成功才可以播放视频  
  91.         PlayVideo();  
  92.     }  
  93.   
  94.     @Override  
  95.     public void surfaceDestroyed(SurfaceHolder holder) {  
  96.           
  97.     }  
  98.       
  99.     //@Override  
  100.     public void onBufferingUpdate(MediaPlayer mp, int percent) {  
  101.         // TODO Auto-generated method stub  
  102.   
  103.     }  
  104.   
  105.     //@Override  
  106.     public void onCompletion(MediaPlayer mp) {  
  107.         // TODO Auto-generated method stub  
  108.   
  109.     }  
  110.   
  111.     //@Override  
  112.     public void onPrepared(MediaPlayer mp) {  
  113.         //MediaPlayer加载准备完毕才能开始播放  
  114.         //mp.start();  
  115.     }  
  116.       
  117. }  
 

 

但是,对于一些人可能会产生另一个问题就是

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

在设置成SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS类型后,无法画图了

SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS的意思是创建一个"PUSH"surface,这个surface没有自己的缓冲区,没有自己的缓冲Buffer.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多