Hello,大家晚上好,终于又相聚了,分别的这几天里我正在忙于一个叫做加密记事本的小项目,虽然直到今天还没有完善的很好,但是真心说很想大家,所以来和你们分享一下接下来的新知识吧!
今天这一篇就讲讲Android的多媒体吧,我想这一定是大家都很感兴趣的地方吧,是不是有些迫不及待了呢,那就快快开始吧!
一.Android的多媒体基础
1.基本类:有两个基本类是Android框架中用来播放音视频的类;
(1)MediaPlayer:提供了Android播放音视频所需要的所有API;
(2)AudioManager:用来管理音视频资源和音频输出设备;
2.这里详细说一下MediaPlayer的相关知识:
(1)MediaPlayer对象的生命周期:
(2)常用方法:
方法:create(Context context, Uri uri) 方法:create(Context context, Uri uri)
解释:静态方法,通过Uri创建一个多媒体播放器。
方法:create(Context context, int resid)
解释:静态方法,通过资源ID创建一个多媒体播放器
方法:create(Context context, Uri uri, SurfaceHolder holder)
解释:静态方法,通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器
方法: getCurrentPosition()
解释:返回 Int, 得到当前播放位置
方法: getDuration()
解释:返回 Int,得到文件的时间
方法:getVideoHeight()
解释:返回 Int ,得到视频的高度
方法:getVideoWidth()
解释:返回 Int,得到视频的宽度
方法:isLooping()
解释:返回 boolean ,是否循环播放
方法:isPlaying()
解释:返回 boolean,是否正在播放
方法:pause()
解释:无返回值 ,暂停
方法:prepare()
解释:无返回值,准备同步
方法:prepareAsync()
解释:无返回值,准备异步
方法:release()
解释:无返回值,释放 MediaPlayer 对象
方法:reset()
解释:无返回值,重置 MediaPlayer 对象
方法:seekTo(int msec)
解释:无返回值,指定播放的位置(以毫秒为单位的时间)
方法:setAudioStreamType(int streamtype)
解释:无返回值,指定流媒体的类型
方法:setDataSource(String path)
解释:无返回值,设置多媒体数据来源【根据 路径】
方法:setDataSource(FileDescriptor fd, long offset, long length)
解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】
方法:setDataSource(FileDescriptor fd)
解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】
方法:setDataSource(Context context, Uri uri)
解释:无返回值,设置多媒体数据来源【根据 Uri】
方法:setDisplay(SurfaceHolder sh)
解释:无返回值,设置用 SurfaceHolder 来显示多媒体
方法:setLooping(boolean looping)
解释:无返回值,设置是否循环播放
事件:setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)
解释:监听事件,网络流媒体的缓冲监听
事件:setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
解释:监听事件,网络流媒体播放结束监听
事件:setOnErrorListener(MediaPlayer.OnErrorListener listener)
解释:监听事件,设置错误信息监听
事件:setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)
解释:监听事件,视频尺寸监听
方法:setScreenOnWhilePlaying(boolean screenOn)
解释:无返回值,设置是否使用 SurfaceHolder 显示
方法:setVolume(float leftVolume, float rightVolume)
解释:无返回值,设置音量
方法:start()
解释:无返回值,开始播放
方法:stop()
解释:无返回值,停止播放
二.音频的播放
其实除了这个类还有一个音乐播放类那就是SoundPool,这两个类各有不同分析一下便于大家理解
1.MediaPlayer:
此类适合播放较大文件,此类文件应该存储在SD卡上,而不是在资源文件里,还有此类每次只能播放一个音频文件。
此类用法如下:
(1)从资源文件中播放
MediaPlayer player = new MediaPlayer.create(this,R.raw.test); player.start();
(2)从文件系统播放
MediaPlayer player = new MediaPlayer(); String path = "/sdcard/test.mp3"; player.setDataSource(path); player.prepare(); player.start();
(3)从网络播放
(1)通过URI的方式:
String path="http://**************.mp3"; //这里给一个歌曲的网络地址就行了 Uri uri = Uri.parse(path); MediaPlayer player = new MediaPlayer.create(this,uri); player.start();
(2)通过设置数据源的方式:
MediaPlayer player = new MediaPlayer.create(); String path="http://**************.mp3"; //这里给一个歌曲的网络地址就行了 player.setDataSource(path); player.prepare(); player.start();
2.SoundPool:
此类特点就是低延迟播放,适合播放实时音实现同时播放多个声音,如游戏中×××的爆炸音等小资源文件,此类音频比较适合放到资源文件夹 res/raw下和程序一起打成APK文件。
用法如下:
SoundPool soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100); HashMap<Integer, Integer> soundPoolMap = new HashMap<Integer, Integer>(); soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong1, 1)); soundPoolMap.put(2, soundPool.load(this, R.raw.dingdong2, 2)); public void playSound(int sound, int loop) { AudioManager mgr = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC); float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC); float volume = streamVolumeCurrent/streamVolumeMax; soundPool.play(soundPoolMap.get(sound), volume, volume, 1, loop, 1f); //参数:1、Map中取值 2、当前音量 3、最大音量 4、优先级 5、重播次数 6、播放速度 } this.playSound(1, 0);
三.视频播放
1.使用VideoView控件:
(1)MainActivity.java
package com.example.l0905_videoview; import java.io.File; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.widget.VideoView; public class MainActivity extends Activity { private VideoView vv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); vv=(VideoView) findViewById(R.id.videoView1); vv.setVideoURI(Uri.fromFile(new File("D:\\english.mp4"))); vv.start(); } }
(2)activitymain.xml
<VideoView android:id="@+id/videoView1" android:layout_width="match_parent" android:layout_height="wrap_content" />
2.SurfaceView+MediaPlayer
(1)MainActivity.java
package com.example.l0905_videoplayer; import java.io.File; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button start,pause,set,stop; private SurfaceView sv; private MediaPlayer mp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sv=(SurfaceView) findViewById(R.id.surfaceView1); start=(Button) findViewById(R.id.button1); pause=(Button) findViewById(R.id.button2); set=(Button) findViewById(R.id.button3); stop=(Button) findViewById(R.id.button4); start.setOnClickListener(this); pause.setOnClickListener(this); set.setOnClickListener(this); stop.setOnClickListener(this); } public void play(){ sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); try { mp.setDataSource(this, Uri.fromFile(new File(/*Environment.getExternalStorageDirectory().getAbsoluteFile()+*/"d:/english.mp4"))); mp.setDisplay(sv.getHolder()); mp.prepare(); mp.start(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void getPosition(){ if(mp.isPlaying()){ int timeAll=mp.getDuration(); System.out.println(timeAll); int time=mp.getCurrentPosition(); System.out.println(time); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: play(); getPosition(); break; case R.id.button2: if(mp.isPlaying()){ mp.pause(); }else{ mp.start(); } getPosition(); break; case R.id.button3: mp.seekTo(60000); getPosition(); break; case R.id.button4: mp.stop(); getPosition(); break; } } }
(2)xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <SurfaceView android:id="@+id/surfaceView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="开始" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="暂停" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="指定" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="停止" /> </LinearLayout> </LinearLayout>