Android提高之MediaPlayer音视频播放
程序员文章站
2022-11-05 17:11:00
前面文章已经详细介绍了android界面的入门技术,相信大家在看完和跟着练习之后,会对于常用的layout和view都会有一定的了解了,接下来就不再强调介绍界面了,而是针对...
前面文章已经详细介绍了android界面的入门技术,相信大家在看完和跟着练习之后,会对于常用的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 android:id="@+id/linearlayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"> <seekbar android:id="@+id/seekbar01" android:layout_height="wrap_content" android:layout_width="fill_parent"></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_height="wrap_content" android:layout_width="fill_parent"></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:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button03" android:text="播放视频"></button> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止播放" android:id="@+id/button04"></button> </linearlayout> </linearlayout>
java部分源码有点长,需要大家耐心解读,详细程序如下:
package com.testmedia; 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 testmedia extends activity { /** called when the activity is first created. */ 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(testmedia.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(testmedia.this, r.raw.big);//读取音频 skb_audio.setmax(m.getduration());//设置seekbar的长度 try { m.prepare(); //准备 } catch (illegalstateexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block 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(testmedia.this, r.raw.test);//读取视频 skb_video.setmax(m.getduration());//设置seekbar的长度 m.setaudiostreamtype(audiomanager.stream_music); m.setdisplay(surfaceholder);//设置屏幕 try { m.prepare(); } catch (illegalargumentexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (illegalstateexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } m.start(); } } } /* * seekbar进度改变事件 */ class seekbarchangeevent implements seekbar.onseekbarchangelistener{ @override public void onprogresschanged(seekbar seekbar, int progress, boolean fromuser) { // todo auto-generated method stub } @override public void onstarttrackingtouch(seekbar seekbar) { ischanging=true; } @override public void onstoptrackingtouch(seekbar seekbar) { m.seekto(seekbar.getprogress()); ischanging=false; } } }
希望本文所述关于mediaplayer的使用能对大家有所帮助。
上一篇: NVIDIA Hopper新架构GPU很快流片:首次双芯、非游戏用
下一篇: 喵星人表示看不起
推荐阅读
-
android使用surfaceview+MediaPlayer播放视频
-
android之视频播放系统VideoView和自定义VideoView控件的应用
-
Android MediaPlayer 音频倍速播放,调整播放速度
-
Android 使用mediaplayer播放res/raw文件夹中的音乐的实例
-
Android开发之ViewFlipper自动播放图片功能实现方法示例
-
Android播放器基础学习之封装库playerBase实例讲解
-
android语音即时通讯之录音、播放功能实现代码
-
Windows Phone 播放音频之MediaPlayer
-
Android提高之MediaPlayer音视频播放
-
Android提高之SurfaceView与多线程的混搭实例