Android声音和视频播放

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

        前面写了十四篇关于界面的入门文章,大家都看完和跟着练习之后,对于常用的Layout和View都会有一定的了解了,接下来的文章就不再强调介绍界面了,而是针对具体的常见功能而展开。

        本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。

         先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面是播放/停止视频,也是用SeekBar来调进度:

 

main.xml的源码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <SeekBar
        android:id="@+id/SeekBar01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </SeekBar>

    <LinearLayout
        android:id="@+id/LinearLayout02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/Button01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="播放音频" >
        </Button>

        <Button
            android:id="@+id/Button02"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="停止播放" >
        </Button>
    </LinearLayout>

    <SeekBar
        android:id="@+id/SeekBar02"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </SeekBar>

    <SurfaceView
        android:id="@+id/SurfaceView01"
        android:layout_width="fill_parent"
        android:layout_height="250px" >
    </SurfaceView>

    <LinearLayout
        android:id="@+id/LinearLayout02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/Button03"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="播放视频" >
        </Button>

        <Button
            android:id="@+id/Button04"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="停止播放" >
        </Button>
    </LinearLayout>

</LinearLayout>
package com.senk.play;
  
import java.io.IOException;    
import java.util.Timer;  
import java.util.TimerTask;  
import android.app.Activity;    
import android.media.AudioManager;  
import android.media.MediaPlayer;  
import android.os.Bundle;    
import android.view.SurfaceHolder;  
import android.view.SurfaceView;  
import android.view.View;    
import android.widget.Button;    
import android.widget.SeekBar;  
import android.widget.Toast;    

public class TestMediaPlayerActivity extends Activity {  
 
   private SeekBar skb_audio=null;  
    private Button btn_start_audio = null;    
    private Button btn_stop_audio = null;  
  
    private SeekBar skb_video=null;  
    private Button btn_start_video = null;    
    private Button btn_stop_video = null;  
    private SurfaceView surfaceView;   
    private SurfaceHolder surfaceHolder;   
    private MediaPlayer m = null;    
    private Timer mTimer;  
    private TimerTask mTimerTask;  
      
    private boolean isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突  
     @Override    
    public void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
       setContentView(R.layout.main);    
          
        //----------Media控件设置---------//  
       m=new MediaPlayer();  
       //播放结束之后弹出提示  
        m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){  
           @Override  
           public void onCompletion(MediaPlayer arg0) {  
               Toast.makeText(TestMediaPlayerActivity.this, "结束", 1000).show();  
                m.release();  
           }  
        });  
      //----------定时器记录播放进度---------//  
        mTimer = new Timer();  
       mTimerTask = new TimerTask() {  
            @Override  
            public void run() {   
                if(isChanging==true)  
                   return;  
                 
                if(m.getVideoHeight()==0)  
                    skb_audio.setProgress(m.getCurrentPosition());  
                else   
                    skb_video.setProgress(m.getCurrentPosition());  
           }  
       };  
        mTimer.schedule(mTimerTask, 0, 10);  
          
       btn_start_audio = (Button) this.findViewById(R.id.Button01);    
      btn_stop_audio = (Button) this.findViewById(R.id.Button02);    
       btn_start_audio.setOnClickListener(new ClickEvent());  
        btn_stop_audio.setOnClickListener(new ClickEvent());  
        skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);  
        skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());  
      btn_start_video = (Button) this.findViewById(R.id.Button03);    
        btn_stop_video = (Button) this.findViewById(R.id.Button04);    
        btn_start_video.setOnClickListener(new ClickEvent());  
       btn_stop_video.setOnClickListener(new ClickEvent());  
        skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);  
        skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());  
       surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);  
        surfaceHolder = surfaceView.getHolder();  
       surfaceHolder.setFixedSize(100, 100);  
       surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
    }    
       
  /* 
   * 按键事件处理 
   */  
 class ClickEvent implements View.OnClickListener{  
   @Override  
    public void onClick(View v) {  
       if(v==btn_start_audio)  
        {  
           m.reset();//恢复到未初始化的状态  
            m=MediaPlayer.create(TestMediaPlayerActivity.this, R.raw.mg);//读取音频 (mp3格式的,wma貌似读不到)  
          skb_audio.setMax(m.getDuration());//设置SeekBar的长度  
           try {                     
               m.prepare();    //准备  
           } catch (IllegalStateException e) {           
                e.printStackTrace();                  
           } catch (IOException e) {             
        e.printStackTrace();                  
           }         
           m.start();  //播放  
       }  
      else if(v==btn_stop_audio || v==btn_stop_video)  
       {  
           m.stop();  
       }  
        else if(v==btn_start_video)  
        {  
           m.reset();//恢复到未初始化的状态  
           m=MediaPlayer.create(TestMediaPlayerActivity.this, R.raw.test);//读取视频  
           skb_video.setMax(m.getDuration());//设置SeekBar的长度  
            m.setAudioStreamType(AudioManager.STREAM_MUSIC);  
            m.setDisplay(surfaceHolder);//设置屏幕  
           try {  
               m.prepare();  
            } catch (IllegalArgumentException e) {  
               e.printStackTrace();  
            } catch (IllegalStateException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
               e.printStackTrace();  
            }  
            m.start();  
        }  
    }  
 }  
    
  /* 
   * SeekBar进度改变事件 
   */  
  class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{  
    @Override  
    public void onProgressChanged(SeekBar seekBar, int progress,  
            boolean fromUser) {  
         
    }  
  
    @Override  
    public void onStartTrackingTouch(SeekBar seekBar) {  
        isChanging=true;  
    }  
 
   @Override  
    public void onStopTrackingTouch(SeekBar seekBar) {  
       m.seekTo(seekBar.getProgress());  
        isChanging=false;     
   }  
  }  
} 

 效果图:

 

 

原文地址:https://www.cnblogs.com/jh5240/p/2486699.html