多媒体播放器

多媒体播放器 多媒体架构

多媒体是计算机和视频技术的结合,实际上它是两个媒体:声音和图像

1.png

音乐播放器

显示播放列表

查询手机外部卡里面的所有歌曲

在此我们运用到了AsyncQueryHandler 这样安全性更高

点击歌曲条目得到歌曲的详细信息,用意图带参数传入播放界面。

播放界面

在播放界面我们使用到了SeekBar控件(可拖动进度条),

在歌曲播放的同时我们要进行进度条进度的同步,我们使用了

mHandler.post(new MyTask());线程内修改当前进度

然后mHandler.postDelayed(this,200);自己不段的调用自己

这样就做到一个进度条更新进度的效果,如果要实现拖动进度条改变

播放位置设置进度条的 seekBar.setOnSeekBarChangeListener(this);

自动重写

// 拖动事件

onProgressChanged(SeekBarseekBar, int progress,boolean fromUser)

// 开始拖动

onStartTrackingTouch(SeekBarseekBar)

// 拖动结束

onStopTrackingTouch(SeekBarseekBar)

我们在拖动结束可以得到进度条的进度值,然而通过进度值设置歌曲的播放位置即可,实现

拖动进度条改变播放位置的效果。

public classMainActivity extends Activity {

    private ListView lv;

       private MyAdapter adapter;

       /** Called when the activity is firstcreated. */

    @Override

    public void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        lv = (ListView) findViewById(R.id.lv);

        

        adapter = new MyAdapter(this, null);

        lv.setAdapter(adapter);

        startQuery();

        // 设置listview点击事件

        lv.setOnItemClickListener(newMyOnItemClickListener());

        

    }

   

    private class MyOnItemClickListenerimplements OnItemClickListener{

              @Override

              publicvoid onItemClick(AdapterView<?> parent, View view, int position,

                            longid) {

                     // TODO Auto-generated method stub

                     Intent intent = newIntent(getApplicationContext(),MediePlayingActivity.class);

                     Cursor c = (Cursor)adapter.getItem(position);

                     String _id = c.getString(Contants.ID_COLUM_INDEX);

                     String name =c.getString(Contants.DISPLAY_NAME_COLUM_INDEX);

                     int max =c.getInt(Contants.DURATION_COLUM_INDEX);

                     intent.putExtra("_id", _id);

                     intent.putExtra("name", name);

                     intent.putExtra("max", max);

                     startActivity(intent);

              }

           

    }

  //AsyncQueryHandlerHandler+ Thread

    private void startQuery(){

           MyQueryHandlermQueryHandler = new MyQueryHandler(getContentResolver());

           Uriuri = Media.EXTERNAL_CONTENT_URI;

           mQueryHandler.startQuery(

                         0,//查询唯一识别

                         null,

                         uri,

                         Contants.PROJECTION,

                         null,

                         null,

                         null);

    }

   

    //异步查询

    private class MyQueryHandler extendsAsyncQueryHandler{

              publicMyQueryHandler(ContentResolver cr) {

                     super(cr);

                     // TODO Auto-generated constructor stub

              }

              

              //查询完成调用

              @Override

              protected voidonQueryComplete(int token, Object cookie, Cursor cursor) {

                     // TODO Auto-generated method stub

                     super.onQueryComplete(token, cookie,cursor);

                     //把数据设置给adapter

                     adapter.changeCursor(cursor);

              }

           

    }

   

   

   private class MyAdapter extends CursorAdapter{

              public MyAdapter(Context context, Cursorc) {

                     super(context,c);

                     //TODO Auto-generated constructor stub

              }

              @Override

              public View newView(Context context,Cursor cursor, ViewGroup parent) {

                     //TODO Auto-generated method stub

                     Viewview = getLayoutInflater().inflate(R.layout.item, null);

                     ViewHolderholder = new ViewHolder();

                     holder.tv_name= (TextView) view.findViewById(R.id.tv_name);

                     holder.tv_arthies= (TextView) view.findViewById(R.id.tv_arthies);

                     view.setTag(holder);

                     returnview;

              }

              @Override

              public void bindView(View view, Contextcontext, Cursor cursor) {

                     //TODO Auto-generated method stub

                     //1得到数据

                     Stringname = cursor.getString(Contants.DISPLAY_NAME_COLUM_INDEX);

                     Stringartist = cursor.getString(Contants.ARTIST_COLUM_INDEX);

                     

                     //2得到控件

                     ViewHolderholder = (ViewHolder) view.getTag();

                     

                     //绑定数据

                     holder.tv_name.setText(name);

                     holder.tv_arthies.setTag(artist);

              }

           

    }

   

   private class ViewHolder{

           TextView tv_name;

           TextView tv_arthies;

           

}

歌曲实体

public class Contents {

   

    public static final String[] PROJECTION = new String[]{

        Media._ID,

        Media.DISPLAY_NAME,

        Media.ARTIST,

        Media.DURATION

    };

    public static final int ID_COLUM_INDEX = 0;

    public static final int DISPLAY_NAME_COLUM_INDEX = 1;

    public static final int ARTIST_COLUM_INDEX = 2;

    public static final int DURATION_COLUM_INDEX = 3;

}

播放歌曲界面

public class MediePlayingActivity extends Activity implements OnSeekBarChangeListener {

    private MediaPlayer mp;

    private String _id;

    // 判断之前是否暂停过

    private boolean flag = false;

    private SeekBar seekBar;

    private Handler mHandler = new Handler();

    private int max;

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        // 得到控件

        EditText  et_name = (EditText) findViewById(R.id.et_name);

        seekBar = (SeekBar)findViewById(R.id.sb);

        

        // 得到数据

        Intent intent = getIntent();

        _id = intent.getStringExtra("_id");

        String name = intent.getStringExtra("name");

        max = intent.getIntExtra("max", 0);

        et_name.setText(name);

        mp = new MediaPlayer();

        // 设置进度条最大值

        seekBar.setMax(max);

      

        

        seekBar.setOnSeekBarChangeListener(this);

        

    }

    private class MyTask implements Runnable{

        @Override

        public void run() {

            // TODO Auto-generated methodstub

            // 不断的把歌曲进度赋值给进度条

            int position  = mp.getCurrentPosition();

            seekBar.setProgress(position);

            mHandler.postDelayed(this,200);

        }

        

}

// 开始按钮

    public void start(View v){

           

        // 开启一个线程去更新进度x

      mHandler.post(new MyTask());

        mp.reset();

        Uri uri = Uri.withAppendedPath(Media.EXTERNAL_CONTENT_URI_id);

        try {

            mp.setDataSource(this,uri);

            mp.prepare();

            mp.start();

        } catch (Exception e) {

            // TODO Auto-generated catchblock

            e.printStackTrace();

        }

   

}

// 暂停按钮

    public void pause(View v){

        Buttonb = (Button)v;

        if(mp.isPlaying()){

            mp.pause();

            flag = true;

            b.setText("继续");

        }else{

            if(flag){

            mp.start();

            b.setText("暂停");

            }

        }

}

// 重新播放按钮

    public void mcontinue(View v){

        mp.reset();

        Uri uri = Uri.withAppendedPath(Media.EXTERNAL_CONTENT_URI_id);

        try {

            mp.setDataSource(this,uri);

            mp.prepare();

            mp.start();

        } catch (Exception e) {

            // TODO Auto-generated catchblock

            e.printStackTrace();

        }

}

// 暂停按钮

    public void stop(View v){

        mp.stop();

    }

    // 拖动事件

    @Override

    public void onProgressChanged(SeekBar seekBar, int progress,

            boolean fromUser) {

        // TODO Auto-generated method stub

        

    }

    // 开始拖动

    @Override

    public void onStartTrackingTouch(SeekBar seekBar) {

        // TODO Auto-generated method stub

        

    }

    // 拖动结束

    @Override

    public void onStopTrackingTouch(SeekBar seekBar) {

        // TODO Auto-generated method stub

        int i = seekBar.getProgress();

        mp.seekTo(i);

        mp.start();

    }

   

}

视频播放器

使用了SurfaceView控件显示视频

SurfaceView

可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器

SurfaceHolder

用来操纵surface,处理它在Canvas上画的效果和动画,控制表面,大小,像素等

surfaceView = (SurfaceView)findViewById(R.id.surfaceview);

       //设置SurfaceHolder,操作surfaceView

       SurfaceHolder holder = surfaceView.getHolder();

       //不让SurfaceView去缓存数据,直接把数据输出

       holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

       //设置固定的大小

       holder.setFixedSize(176, 144);

       //设置屏幕的高亮

       holder.setKeepScreenOn(true);

       //设置屏幕的高亮

       surfaceView.setKeepScreenOn(true);

要在点击开始的时候设置显示

mp.setDisplay(sv.getHolder());

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VLC Media Player 多媒体播放器(最初命名为 VideoLAN 客户端)是 VideoLAN 计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持 DVD 影音光盘,VCD 影音光盘及各类流式协议。它也能作为 unicast 或 multicast 的流式服务器在 IPv4 或 IPv6 的高速网络连接下使用。它融合了 FFmpeg 计划的解码器与 libdvdcss 程序库使其有播放多媒体文件及加密 DVD 影碟的功能。 多媒体播放器 VLC Media Player 中文版VLC Media Player 中文绿色版 VLC Media Player 可以播放 MPEG-1、MPEG-2、MPEG-4、DivX、DVD/VCD、数字卫星频道、数字地球电视频道(digital terrestrial television channels)、在许多作业平台底下透过宽频 IPv4、IPv6 网络播放线上影片;此软件开发项目是由法国学生所发起的,参与者来自于世界各地,设计了多平台的支持,可以用于播放网络串流及本机多媒体档案之播放。 VideoLAN计划是一个开发多媒体播放程序的计划。原本针对流式影音有两个程序— VideoLAN Client (VLC) 及 VideoLAN Server (VLS)—然而大部分的 VLS 功能都集成进 VLC,所以就将程序名称改为 VLC 多媒体播放器。 这个计划原本是巴黎中央理工学院学生的专题计划。在 2001 年 2 月 1 日以 GPL 发布后,计划成员横跨二十多个国家。 这个播放软件的三角锥图标是源自于交通三角锥。图标是 2006 年高分辨率的 CGI 页面 Computer-generated imagery 并不存在,英语维基百科对应页面为电脑成像。用以取代先前手绘的低分辨率图标。 VLC 多媒体播放器具有跨平台的特性,它有Linux、Microsoft Windows、Mac OS X、BeOS、BSD、Pocket PC 及 Solaris 的版本。 与另一个著名播放器 Mplayer(使用 Gtk+ 库)不同的是,VLC 使用了 Qt 库来编写 Linux 的用户操作界面。 在 Windows,Linux 以及某些平台,VLC 提供了一个 Mozilla 扩充包,使得某些网站上附带的QuickTime及Windows Media多媒体文件,可以在非微软或苹果计算机的操作系统中,正常显示于Mozilla 的浏览器下。 从版本 0.8.2 开始,VLC 亦提供了一个 ActiveX 的扩充包,使用户可以在 Internet Explorer 下,正常显示某些网站上附带的 QuickTime 及 Windows Media 多媒体文件。 从 1.0.5 版本开始 VLC 的 ActiveX 的扩充包已经放弃 js 接口的调用。 VLC 还有一个非常好的功能——支持播放某些没有下载完成的视频文件部份内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值