MediaPlayer用法

MediaPlayer具有非常强大的功能:

在MediaPlayer中,根据数据源为元数据、音频文件、音频流的不同情况,有着相应的处理过程。基本的过程如下:

1)播放元数据

如果元数据位于Android工程的“res/raw”文件夹下。播放元数据的过程为:
    MediaPlayer mp=MediaPlayer.create(context, R.raw.sound_file_1);
    mp.start();

2)播放音频文件

如果音频文件的路径为PATH_TO_FILE,播放音频文件的过程为:
    MediaPlayer mp=new MediaPlayer();
    mp.setDataSource(PATH_TO_FILE); //设置数据源
    mp.prepare();
    mp.start();

setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)

网络上的媒体文件
例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");

  其中使用 FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
来设置datasource

3)播放音频流

如果音频文件的URL地址为URL_ADRESS,播放音频流的过程为:
    MediaPlayer mp=new MediaPlayer();
    mp.setDataSource(URL_ADRESS); //设置数据源
    mp.prepare();
    mp.start();


4)对播放器的主要控制方法:
Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:
prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
start()是真正启动文件播放的方法,
pause()和stop()比较简单,起到暂停和停止播放的作用,
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。
reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。

5)设置播放器的监听器:
MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,
如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、
setOnErrorListener(MediaPlayer.OnErrorListener listener)等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。

当需要做到循环播放时:
监听onComplationListener 当你放完一个视频时 在这个监听器里的方法里再setDataSource 另一个 视频 
list的保存文件路径方式 ,最好在每次播放时都reset() 然后在onPreparelistener监听器中启动start()方法。

备注:对音视频的播放均提供了支持,为了保证播放期间系统的屏幕一直工作,需要设置"android.permission.WAKE_LOCK"权限。如果要访问sd卡,还要加sd卡读写权限。

代码实例:

public class MainActivity extends Activity {  
    private static final String TAG = "PlayerActivity";  
    private EditText filenameText;  
    private MediaPlayer mediaPlayer;  
    private SurfaceView surfaceView;   
    private int position = 0; 
    private int index = 1;
      
@Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        mediaPlayer = new MediaPlayer();  
 
        filenameText = (EditText)this.findViewById(R.id.filename);  
          
        surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);  
        surfaceView.getHolder().setFixedSize(176, 144);//设置分辨率   
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
        surfaceView.getHolder().addCallback(new SurfaceCallback());  
  
       
        ButtonClickListener listener = new ButtonClickListener();  
        ImageButton playButton = (ImageButton)this.findViewById(R.id.play);  
        ImageButton pauseButton = (ImageButton)this.findViewById(R.id.pause);  
        ImageButton resetButton = (ImageButton)this.findViewById(R.id.reset);  
        ImageButton stopButton = (ImageButton) this.findViewById(R.id.stop);  
        playButton.setOnClickListener(listener);  
        pauseButton.setOnClickListener(listener);  
        resetButton.setOnClickListener(listener);  
        stopButton.setOnClickListener(listener);
        mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
File videoFile = new File(Environment.getExternalStorageDirectory(), "intro.mp4");  
}
});
        mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mediaPlayer.start();//播放 
}
});
        


    }  
      


    private final class SurfaceCallback implements SurfaceHolder.Callback{  
        @Override  
        public void surfaceCreated(SurfaceHolder holder) {  
             
                try {  
                    play();  
                    mediaPlayer.seekTo(position);  
                    position = 0;  
                } catch (IOException e) {  
                    Log.e(TAG, e.toString());  
                 
            }  
        }  
        @Override  
        public void surfaceChanged(SurfaceHolder holder, int format, int width,  
                int height) {  
        }  
        @Override  
        public void surfaceDestroyed(SurfaceHolder holder) {  
            if(mediaPlayer.isPlaying()){  
                position = mediaPlayer.getCurrentPosition();  
                mediaPlayer.stop();  
            }  
        }         
    }  
  
    private final class ButtonClickListener implements View.OnClickListener{  
        @Override  
        public void onClick(View v) {  
            if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
                //Toast.makeText(PlayerActivity.this, R.string.sdcarderror, 1).show();  
                return;  
            }  
            try {  
                switch (v.getId()) {  
                case R.id.play:  
                    play();                   
                    break;  
  
                case R.id.pause:  
                    if(mediaPlayer.isPlaying()){  
                        mediaPlayer.pause();  
                    }else{  
                        mediaPlayer.start();  
                    }  
                    break;  
                case R.id.reset:  
                    if(mediaPlayer.isPlaying()){  
                        mediaPlayer.seekTo(0);  
                    }else{  
                        play();  
                    }  
                    break;  
                case R.id.stop:  
                    if(mediaPlayer.isPlaying()) mediaPlayer.stop();  
                    break;  
                }  
            } catch (Exception e) {  
                Log.e(TAG, e.toString());  
            }  
        }  
    }  
  
    private void play() throws IOException {
    String value = "intro.mp4";
    if(index == 2) {
    value = "lenovotechcity1920 [Android 720p AVC].mp4";
    index = 0;
    }
        final File videoFile = new File(Environment.getExternalStorageDirectory(), value);  
       mediaPlayer.reset();//重置为初始状态   
       mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
       /* 设置Video影片以SurfaceHolder播放 */  
       mediaPlayer.setDisplay(surfaceView.getHolder());  
       mediaPlayer.setDataSource(videoFile.getAbsolutePath());
       
       mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
try {

mediaPlayer.setDataSource(videoFile.getAbsolutePath());
index++;
} 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();
}  
}
});
       mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
   try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//缓冲
mediaPlayer.start();//播放 
}
});
       
       
       Log.i(TAG, videoFile.getAbsolutePath());
       mediaPlayer.prepare();//缓冲 
       mediaPlayer.start();//播放 
       mediaPlayer.setLooping(true);


        
    }  
    
    private void onComplationListener() {
// TODO Auto-generated method stub


}
    
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值