关闭 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();         
      }        
      }    
      } 
      }
    上一篇返回首页 下一篇

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

    别人在看

    电脑屏幕不小心竖起来了?别慌,快捷键搞定

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    IT头条

    Synology 更新 ActiveProtect Manager 1.1 以增强企业网络弹性和合规性

    00:43

    新的 Rubrik Agent Cloud 加速了可信的企业 AI 代理部署

    00:34

    宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车

    00:21

    Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践

    02:05

    投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会

    01:18

    技术热点

    大型网站的 HTTPS 实践(三):基于协议和配置的优化

    ubuntu下右键菜单添加新建word、excel文档等快捷方式

    Sublime Text 简明教程

    用户定义SQL Server函数的描述

    怎么在windows 7开始菜单中添加下载选项?

    SQL Server 2016将有哪些功能改进?

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

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