关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android中SurfaceView视频播放实现代码

    Android中SurfaceView视频播放实现代码

    2014-12-15 00:00:00 出处:互联网
    分享

    Surfaceview的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。

    1.案例一

    布局文件:

    < xml version="1.0" encoding="utf-8" >
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent"   
     android:layout_height="fill_parent" android:weightSum="1">    
    <SurfaceView 
    android:layout_height="220dip"
    android:layout_gravity="center" 
    android:id="@+id/surface" 
    android:layout_weight="0.25" 
    android:layout_width="320dip">
    </SurfaceView>    
    <LinearLayout
    android:id="@+id/linearLayout1" 
    android:layout_height="wrap_content"
    android:layout_width="fill_parent">        
    <Button 
    android:text="播放" 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    </Button>       
    <Button 
    android:text="暂停" 
    android:id="@+id/button2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    </Button>       
    <Button 
    android:text="停止" 
    android:id="@+id/button3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    </Button>   
    </LinearLayout>
    </LinearLayout>

    主程序:

     

    public class SurfaceActivity extends Activity implements SurfaceHolder.Callback {   
          /** Called when the activity is first created. */    
         MediaPlayer player;    
         SurfaceView surface;     
        SurfaceHolder surfaceHolder;     
        Button play,pause,stop;     
        @Override   
          public void onCreate(Bundle savedInstanceState) {    
            super.onCreate(savedInstanceState);        
          setContentView(R.layout.main);         
         play=(Button)findViewById(R.id.button1);        
          pause=(Button)findViewById(R.id.button2);        
          stop=(Button)findViewById(R.id.button3);         
          surface=(SurfaceView)findViewById(R.id.surface);       
            surfaceHolder=surface.getHolder();//SurfaceHolder是SurfaceView的控制接口        
          surfaceHolder.addCallback(this); //因为这个类实现了SurfaceHolder.Callback接口,所以回调参数直接this         
         surfaceHolder.setFixedSize(320, 220);//显示的分辨率,不设置为视频默认         
         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//Surface类型          
         play.setOnClickListener(new OnClickListener(){           
            @Override           
           public void onClick(View v) {               
           player.start();           
           }});        
         pause.setOnClickListener(new OnClickListener(){       
               @Override            
          public void onClick(View v) {         
                 player.pause();           
           }});         
          stop.setOnClickListener(new OnClickListener(){       
                @Override          
            public void onClick(View v) {              
           player.stop();          
            }});    
         }     
         @Override    
         public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {    
         }     
         @Override     
        public void surfaceCreated(SurfaceHolder arg0) { 
        //必须在surface创建后才能初始化MediaPlayer,否则不会显示图像      
           player=new MediaPlayer();        
          player.setAudioStreamType(AudioManager.STREAM_MUSIC);    
           player.setDisplay(surfaceHolder);       
          //设置显示视频显示在SurfaceView上           
          try {               
          player.setDataSource("/sdcard/3.mp4");         
                player.prepare();             
        } catch (Exception e) {             
            e.printStackTrace();          
           }    
         }      
        @Override     
        public void surfaceDestroyed(SurfaceHolder arg0) {      
           // TODO Auto-generated method stub   
           }      
        @Override    protected void onDestroy() {       
          // TODO Auto-generated method stub       
          super.onDestroy();        
         if(player.isPlaying()){      
           player.stop();        }      
           player.release();       
          //Activity销毁时停止播放,释放资源。不做这个操作,即使退出还是能听到视频播放的声音 
            } 
        }

    2.案例二

    布局文件main.xml

     

    < xml version="1.0" encoding="utf-8" > 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     
    android:orientation="vertical"     
    android:layout_width="fill_parent"     
    android:layout_height="fill_parent"     
    android:background="#ffffff"     
    > 
    <TextView   
       android:layout_width="wrap_content"     
    android:layout_height="wrap_content"    
    android:text="@string/filename"     
    /> 
    <EditText  
    android:layout_width="fill_parent"     
    android:layout_height="wrap_content"    
    android:text="oppo.mp4"    
    android:id="@+id/filename"    
    /> 
    <LinearLayout     
    android:orientation="horizontal"    
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"    
    >     
    <ImageButton  
    android:layout_width="wrap_content"  
    android:layout_height="fill_parent"      
    android:src="@drawable/play"     
       android:id="@+id/play"    
    />    
    <ImageButton  
    android:layout_width="wrap_content"   
    android:layout_height="fill_parent"     
       android:src="@drawable/pause"         
    android:id="@+id/pause"     
    />    
    <ImageButton   
    android:layout_width="wrap_content"   
    android:layout_height="fill_parent"     
       android:src="@drawable/stop"      
    android:id="@+id/stop"    
    />   
    <ImageButton  
    android:layout_width="wrap_content"   
    android:layout_height="fill_parent"    
    android:src="@drawable/reset"       
    android:id="@+id/reset"   
    /> 
    </LinearLayout> 
    <SurfaceView  
    android:layout_width="fill_parent"      
    android:layout_height="fill_parent"      
    android:id="@+id/surfaceview"   
    /> 
    </LinearLayout>

    主程序VodeoPlayActivity.java

     

    public class VodeoPlayActivity extends Activity {   
      /** Called when the activity is first created. */    
      private EditText filenamEditText;  
      private MediaPlayer mediaPlayer;    
      private String filename;    
      private SurfaceView surfaceView;    
      private final static String TAG="VodeoPlayActivity";  
      private int prosition=0;        
      @Override    
      public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);     
      setContentView(R.layout.main);        
      filenamEditText=(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不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前     
      surfaceView.getHolder().addCallback(new SurceCallBack());//对surface对象的状态进行监听      
      mediaPlayer=new MediaPlayer();           
      ButtonOnClikListiner buttonOnClikListinero=new ButtonOnClikListiner();      
      ImageButton start=(ImageButton) this.findViewById(R.id.play);         
      ImageButton pause=(ImageButton) this.findViewById(R.id.pause);        
      ImageButton stop=(ImageButton) this.findViewById(R.id.stop);        
      ImageButton replay=(ImageButton) this.findViewById(R.id.reset);      
      start.setOnClickListener(buttonOnClikListinero);     
      pause.setOnClickListener(buttonOnClikListinero);     
      stop.setOnClickListener(buttonOnClikListinero);      
      replay.setOnClickListener(buttonOnClikListinero);    
      }      
      private final class ButtonOnClikListiner implements View.OnClickListener{      
      @Override    
      public void onClick(View v) {    
      if(Environment.getExternalStorageState()==Environment.MEDIA_UNMOUNTED){       
      Toast.makeText(VodeoPlayActivity.this, "sd卡不存在", Toast.LENGTH_SHORT).show();             
      return;       
      }         
      filename=filenamEditText.getText().toString();         
      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;            
      }        
      }      
      }       
      private void play() {     
      try {                
      File file=new File(Environment.getExternalStorageDirectory(),filename);        
      mediaPlayer.reset();//重置为初始状态         
      mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置音乐流的类型            
      mediaPlayer.setDisplay(surfaceView.getHolder());//设置video影片以surfaceviewholder播放       
      mediaPlayer.setDataSource(file.getAbsolutePath());//设置路径             
      mediaPlayer.prepare();//缓冲                
      mediaPlayer.start();//播放            
      } catch (Exception e) {         
      Log.e(TAG, e.toString());                
      e.printStackTrace();            
      }     
      }      
      private final class SurceCallBack implements SurfaceHolder.Callback{    
      /**         * 画面修改         */        
      @Override        
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
      // TODO Auto-generated method stub                
      }       
      /**         * 画面创建         */     
      @Override        
      public void surfaceCreated(SurfaceHolder holder) {           
      if(prosition>0&&filename!=null){            
      play();               
      mediaPlayer.seekTo(prosition);            
      prosition=0;            }          
      }      
      /**         * 画面销毁         */        
      @Override        
      public void surfaceDestroyed(SurfaceHolder holder) {      
      if(mediaPlayer.isPlaying()){        
      prosition=mediaPlayer.getCurrentPosition();          
      mediaPlayer.stop();         
      }        
      }    
      } 
      }
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Edge浏览器百度被劫持/篡改怎么办,地址后边跟着尾巴#tn=68018901_7_oem_dg

    Google Chrome 在 iPhone 上新增了 Safari 数据导入选项

    Windows 11专业版 KMS工具激活产品密钥的方法

    DEDECMS安全策略官方出品

    Microsoft Text Input Application 可以关闭吗?

    新版本QQ如何关闭自带的浏览器?

    C++编程语言中continue的用法和功能,附举例示范代码

    c++ map 的数据结构、基本操作以及其在实际应用中的使用。

    C语言如何避免内存泄漏、缓冲区溢出、空指针解引用等常见的安全问题

    C语言中的break语句详解

    IT头条

    马斯克2026最新采访总结:2040年,全球机器人数量将突破100亿台

    23:52

    专家解读|规范人工智能前沿业态健康发展的新探索:解读《人工智能拟人化互动服务管理暂行办法》

    00:54

    用至强 6高存力搞定MoE卸载!

    17:53

    美国将允许英伟达向中国“经批准的客户”出售H200 GPU

    02:08

    苹果与微信就15%手续费达成一致?腾讯未置可否

    22:00

    技术热点

    PHP 和 Node.js 的10项对比挑战

    Javascript闭包深入解析及实现方法

    windows 7、windows 8.1手动增加右键菜单功能技巧

    MYSQL出错代码大汇总

    windows 7假死机怎么办 windows 7系统假死机的原因以及解决方法

    Ubuntu(Linux)下配置IP地址的方法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。