zoukankan      html  css  js  c++  java
  • MediaPlayer开发全解析

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

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

     Android提高21篇之一:MediaPlayer

           main.xml的源码:

    XML/HTML代码
    1. <linearlayout android:id="@+id/LinearLayout01"   
    2.         android:layout_width="fill_parent" android:layout_height="fill_parent"  
    3.         xmlns:android="http://schemas.android.com/apk/res/android"  
    4.         android:orientation="vertical">  
    5.         <seekbar android:id="@+id/SeekBar01" android:layout_height="wrap_content"   
    6.                 android:layout_width="fill_parent">  
    7.         <linearlayout android:id="@+id/LinearLayout02"   
    8.                 android:layout_width="wrap_content" android:layout_height="wrap_content">  
    9.                 <button android:id="@+id/Button01" android:layout_width="wrap_content"   
    10.                         android:layout_height="wrap_content" android:text="播放音频">  
    11.                 <button android:id="@+id/Button02" android:layout_width="wrap_content"   
    12.                         android:layout_height="wrap_content" android:text="停止播放">  
    13.           
    14.         <seekbar android:id="@+id/SeekBar02" android:layout_height="wrap_content"   
    15.                 android:layout_width="fill_parent">  
    16.   
    17.         <surfaceview android:id="@+id/SurfaceView01"   
    18.                 android:layout_width="fill_parent" android:layout_height="250px">  
    19.         <linearlayout android:id="@+id/LinearLayout02"   
    20.                 android:layout_width="wrap_content" android:layout_height="wrap_content">  
    21.                 <button android:layout_width="wrap_content"   
    22.                         android:layout_height="wrap_content" android:id="@+id/Button03"  
    23.                         android:text="播放视频">  
    24.                 <button android:layout_width="wrap_content"   
    25.                         android:layout_height="wrap_content" android:text="停止播放" android:id="@+id/Button04">  

           本文程序的源码,有点长:

    Java代码
    1. package com.testMedia;  
    2.   
    3. import java.io.IOException;    
    4. import java.util.Timer;  
    5. import java.util.TimerTask;  
    6. import android.app.Activity;    
    7. import android.media.AudioManager;  
    8. import android.media.MediaPlayer;  
    9. import android.os.Bundle;    
    10. import android.view.SurfaceHolder;  
    11. import android.view.SurfaceView;  
    12. import android.view.View;    
    13. import android.widget.Button;    
    14. import android.widget.SeekBar;  
    15. import android.widget.Toast;    
    16.   
    17.   
    18. public class testMedia extends Activity {  
    19.           /** Called when the activity is first created. */   
    20.   
    21.         private SeekBar skb_audio=null;  
    22.     private Button btn_start_audio = null;    
    23.     private Button btn_stop_audio = null;  
    24.   
    25.     private SeekBar skb_video=null;  
    26.     private Button btn_start_video = null;    
    27.     private Button btn_stop_video = null;  
    28.     private SurfaceView surfaceView;   
    29.     private SurfaceHolder surfaceHolder;   
    30.       
    31.     private MediaPlayer m = null;    
    32.     private Timer mTimer;  
    33.     private TimerTask mTimerTask;  
    34.       
    35.     private boolean isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突  
    36.      @Override    
    37.     public void onCreate(Bundle savedInstanceState) {    
    38.         super.onCreate(savedInstanceState);    
    39.         setContentView(R.layout.main);    
    40.           
    41.         //----------Media控件设置---------//  
    42.         m=new MediaPlayer();  
    43.           
    44.         //播放结束之后弹出提示  
    45.         m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){  
    46.                         @Override  
    47.                         public void onCompletion(MediaPlayer arg0) {  
    48.                                 Toast.makeText(testMedia.this, "结束", 1000).show();  
    49.                                 m.release();  
    50.                         }  
    51.         });  
    52.           
    53.       //----------定时器记录播放进度---------//  
    54.         mTimer = new Timer();  
    55.         mTimerTask = new TimerTask() {  
    56.             @Override  
    57.             public void run() {          
    58.                     if(isChanging==true)  
    59.                             return;  
    60.                       
    61.                     if(m.getVideoHeight()==0)  
    62.                             skb_audio.setProgress(m.getCurrentPosition());  
    63.                     else   
    64.                             skb_video.setProgress(m.getCurrentPosition());  
    65.             }  
    66.         };  
    67.   
    68.         mTimer.schedule(mTimerTask, 0, 10);  
    69.                   
    70.         btn_start_audio = (Button) this.findViewById(R.id.Button01);    
    71.         btn_stop_audio = (Button) this.findViewById(R.id.Button02);    
    72.         btn_start_audio.setOnClickListener(new ClickEvent());  
    73.         btn_stop_audio.setOnClickListener(new ClickEvent());  
    74.         skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);  
    75.         skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());  
    76.           
    77.         btn_start_video = (Button) this.findViewById(R.id.Button03);    
    78.         btn_stop_video = (Button) this.findViewById(R.id.Button04);    
    79.         btn_start_video.setOnClickListener(new ClickEvent());  
    80.         btn_stop_video.setOnClickListener(new ClickEvent());  
    81.         skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);  
    82.         skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());  
    83.         surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);  
    84.         surfaceHolder = surfaceView.getHolder();  
    85.         surfaceHolder.setFixedSize(100, 100);  
    86.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
    87.     }    
    88.        
    89.   /* 
    90.    * 按键事件处理 
    91.    */  
    92.   class ClickEvent implements View.OnClickListener{  
    93.         @Override  
    94.         public void onClick(View v) {  
    95.                 if(v==btn_start_audio)  
    96.                 {  
    97.                         m.reset();//恢复到未初始化的状态  
    98.                         m=MediaPlayer.create(testMedia.this, R.raw.big);//读取音频  
    99.                         skb_audio.setMax(m.getDuration());//设置SeekBar的长度  
    100.                         try {                                          
    101.                                 m.prepare();        //准备  
    102.                         } catch (IllegalStateException e) {                          
    103.                                 // TODO Auto-generated catch block                                  
    104.                                 e.printStackTrace();                                  
    105.                         } catch (IOException e) {                          
    106.                                 // TODO Auto-generated catch block                                  
    107.                                 e.printStackTrace();                                  
    108.                         }                  
    109.                         m.start();        //播放  
    110.                 }  
    111.                 else if(v==btn_stop_audio || v==btn_stop_video)  
    112.                 {  
    113.                         m.stop();  
    114.                 }  
    115.                 else if(v==btn_start_video)  
    116.                 {  
    117.                         m.reset();//恢复到未初始化的状态  
    118.                         m=MediaPlayer.create(testMedia.this, R.raw.test);//读取视频  
    119.                         skb_video.setMax(m.getDuration());//设置SeekBar的长度  
    120.                         m.setAudioStreamType(AudioManager.STREAM_MUSIC);  
    121.                         m.setDisplay(surfaceHolder);//设置屏幕  
    122.                           
    123.                         try {  
    124.                             m.prepare();  
    125.                               
    126.                         } catch (IllegalArgumentException e) {  
    127.                                 // TODO Auto-generated catch block  
    128.                                 e.printStackTrace();  
    129.                         } catch (IllegalStateException e) {  
    130.                                 // TODO Auto-generated catch block  
    131.                                 e.printStackTrace();  
    132.                         } catch (IOException e) {  
    133.                                 // TODO Auto-generated catch block  
    134.                                 e.printStackTrace();  
    135.                         }  
    136.                         m.start();  
    137.                 }  
    138.         }  
    139.   }  
    140.     
    141.   /* 
    142.    * SeekBar进度改变事件 
    143.    */  
    144.   class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{  
    145.   
    146.         @Override  
    147.         public void onProgressChanged(SeekBar seekBar, int progress,  
    148.                         boolean fromUser) {  
    149.                 // TODO Auto-generated method stub  
    150.                   
    151.         }  
    152.   
    153.         @Override  
    154.         public void onStartTrackingTouch(SeekBar seekBar) {  
    155.             isChanging=true;  
    156.         }  
    157.   
    158.         @Override  
    159.         public void onStopTrackingTouch(SeekBar seekBar) {  
    160.                 m.seekTo(seekBar.getProgress());  
    161.             isChanging=false;          
    162.         }  
    163.             
    164.   }  
    165.   
    166. }  
  • 相关阅读:
    MongoDB for OPS 02:复制集 RS 配置
    MongoDB for OPS 01:服务介绍与基本使用
    Redis for OPS 07:Redis 补充说明
    Redis for OPS 06:Redis Cluster 集群
    google ctemplate——c++模板引擎
    libctemplate——源码分析
    使用gulp对js、css、img进行合并压缩
    Windows平台交叉编译Arm Linux平台的QT5.7库
    使用gtest对DLL工程进行单元测试的实践
    websocket++简单使用例子
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3934835.html
Copyright © 2011-2022 走看看