zoukankan      html  css  js  c++  java
  • 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;     
       }  
      }  
    } 

     效果图:

     

     

  • 相关阅读:
    MarkDowdPad 破解
    VimFaultException A specified parameter was not correct configSpec.guestId
    did not finish being created even after we waited 189 seconds or 61 attempts. And its status is downloading
    nsx-edge虚拟机抓包实践
    检查子网内存活的主机
    测试防火墙源端口
    vmware创建虚拟机不识别网卡
    ovs-qos配置
    ovs之组网实验
    openstack镜像制作
  • 原文地址:https://www.cnblogs.com/jh5240/p/2486699.html
Copyright © 2011-2022 走看看