使用MediaPlayer播放音频
使用SoundPool播放音频
使用VideoView播放视频
使用MediaPlayer和SurfaceView播放视频
使用Camera拍照
使用系统相机
使用MediaRecord录音
Android媒体格式
Android提供了对常用音频和视频格式的支持,它所支持的音频格式有MP3,3GP,OGG,和
WAVE(.ave)等,支持的视频格式有3GP和MPEG-4等,通过Android API提供的方法,可以实现音
频与视频的播放
使用MediaPlayer播放音频
创建MediaPlayer对象,并装载音频文件方法如下
//用于从资源ID对应的资源文件中装载音频,并返回新创建的MediaPlayer对象
MediaPlayer player=MediaPlayer.create(this,R.raw.d);
//用于根据指定的URI来装载音频,并返回新创建的MediaPlayer对象
MediaPlayer player=MediaPlayer.create(this,Uri,pares("http://www.music.baidu.com/sound/mylove.mp3"));
但是,注意,这里的访问网络上的资源时,要在AndroidManifest.xml文件中授予该程序访问网络
的权限,具代码如下
<use-permission android:name=”android.permission.INTERNET”/>
以上两种方法是用数的静态方法创建的播放器对象,在创建的时候就要指定播放的资源文件的位
置,此时我们可以根据无参数的构造方法,用 setDataSource() 方法实现:
MediaPlayer player=new MediaPlayer();
player.setDataSource(“/sdcard/s.wav”);
player.prepare();使用构造方法创建的MediaPlayer必须预加载音频。
常用方法
public void setDataSource() //重载方法 //设置资源
public void start() throws IllegalStateException //开始播放
public void stop() throws IllegalStateException //停止播放
public void pause() throws IllegalStateException //暂停播放
public native void prepare() throws IOException,IllegalStateException;//同步加载
public native void prepareAsync() throws IllegalStateException;//异步加载,完成后调用监听
public native boolean isPlaying(); //本地方法,判断播放状态
public native void seekTo(int msec) throws IllegalStateException//本地方法,跳转到时间点
public native int getDuration(); //本地方法,获取音乐总长度
public void release() //释放资源
public void reset() //重置MediaPlayer
public native void setLooping(boolean looping) //设置循环
public native boolean isLooping(); //判断循环状态
public native void setVolume(float leftVolume, float rightVolume)//设置音量
public void setVolume(float volume) //设置音量
本地方法native
在java中,native方法是指本地方法,当在方法中调用一些不是由java语言写的代码或者
在方法中用java语言直接操纵计算机硬件时要声明为native方法。
同步与异步的区别
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那
么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需
要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统
会通知进程进行处理,这样可以提高执行的效率
监听方式
//异步加载完成时回调监听
public void setOnPreparedListener(OnPreparedListener listener)
//音乐播放完毕后回调监听
public void setOnCompletionListener(OnCompletionListener listener)
//当跳转完成时的监听
public void setOnSeekCompleteListener(OnSeekCompleteListener listener)
使用SoundPool播放音频
由于MediaPlayer占用资源较高,且不支持同时播放多个音频,所有Android为我们提供了另一
个播放音频的SounePool.SoundPool也就是音频池,它可以同时播放多个短促的音频,而且占用
的资源少,例如游戏中的多个音频同时播放。
使用SoundPool播放音频的步骤如下:
1,创建SoundPool对象
SoundPool(int maxStreams,int streamType,int srcQuality)
//其中,maxStreams用来指定可以容纳多少个音频,streamType用来指定声音类型,可以通过
AudioManager类提供的常量进行指定,通常使用STREAM_MUSIC; srcQuality参数用于指定
音频的品质,0为默认
2,加载所要播放的音
Public int load(Context context,int resid,int priority)
用于通过指定的资源来加载音频
Public int load(String path,int priority)
用于通过音频文件的路径来加载音频
Public int load(AssetFileDescriptor afd,int priority)
用于从AssetFileDescriptor所对应的文件中加载音频
Public int load(FileDescriptor fd,long offset,long length,int priority)
用于加载FileDescriptor对象中,从offset开始,长度为length的音频
3,播放音频
play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
参数说明:
参数 描述
soundID 用于指定要播放的音频,该音频为通过load()方法返回的音频
leftVolume 用于指定左声道的音量,取值为0-1.0
rightVolume 用于指定左声道的音量,取值为0-1.0
priority 用于指定播放音频的优先级,数值越大,优先级越高
loop 用于设置循环次数0为不循环-1为循环
rate 用于指定速率,1为正常,最小值为0.5 最高值为2
使用VideoView播放视频
在Android中提供了一个VideoView播放视频,用于播放视频文件,要想使用VideoView组件播
放视频,首先需要在布局文件中创建该组件,然后在Activity中获取该组件,并
用 setVideoPath() 方法或 setVideoURI() 方法加载要播放的视频,最后调用VideoView组件
的 start() 方法来播放视频。
在android中,还提供了一个可以与VideoView组件结合使用的MediaContraller组件。
MediaContraller组件用于通过图形控制界面来控制视频的播放
使用MediaPlayer和SurfaceView播放视频
MediaPlayer还可以用来播放视频文件,只不过使用MediaPlayer播放视频时,没有提供图形输
出界面,这时可以使用SurfaceView组件来显示视频图像.使用MediaPlayer和SurfaceView来播
放视频,大致可以分为4个步骤
1.定义SurfaceView组件
2.创建MdeiaPlayer对象,并为其加载要播放的视频
3.将所播放的视频画面输出到SurfaceView
4.调用MediaPlayer对象的相应方法控制视频的播放
使用Camera拍照
现在的手机和平板电脑一般都会提供相机功能,而且相机功能应用越来越广泛,在android中提供
了专门用于处理相机相关事件的来,它就是android.hardware包中的Camera类。
Camera类没有构造方法,可以通过其提供的open()方法打开相机,APP要有打开的权限
打开相机后,可以通过Camera.Parameters类处理 相机的拍照参数.拍照参数设置完成后,可以
调用 startPreview() 方法预览拍照画面,可以使用SurfceView来预览画面
也可以调用 takePicture() 方法进行拍照,结束程序时,可以调用Camera类 stopPreview() 方
法结束预览,并调用Camera类的 release() 方法释放相机资源,Camera类常用的方法及子类
getParameters() 用于获取相机参数
Camera.open() 用于打开相机
release() 用于释放相机资源
setParameters(Camera.Parameters params) 用于设置相机的拍照参数
setPreviewDisplay(SurfaceHolder holder) 用于为相机指定一个用来显示相机预览画面的SurfaceView
startPreview() 用于开始预览画面
stopPreview() 用于停止预览画面
//拍照方法,执行后会停止预览效果
takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)
shutter: /* 按快门瞬间会执行这里的代码 */
raw: /* 如需要处理raw则在这里写代码 */
jpeg: /* 当拍照后存储jpg文件到sd卡 */
保存图片需要添加SD卡权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注意:很多手机不允许设置相机属性,直接打开预览即可
使用系统相机
// 创建打开系统相机的意图
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 使用一个File的对象,把数据存到我们想要的地方
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(currentFile));
startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
使用MediaRecord录音
mediaRecorder = new MediaRecorder();//创建一个音频对象
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//指定录音硬件
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);//指定输出格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);//指定编码格式
mediaRecorder.setOutputFile(soundFile.getAbsolutePath());//把音频输出到手机的某个文件中
需要添加权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
下面一个示例:播放音乐
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener {
MediaPlayer mediaPlayer;
Button btn_play, btn_stop;
SeekBar sb;
TextView time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_play = (Button) findViewById(R.id.btn_play);
btn_stop = (Button) findViewById(R.id.btn_stop);
btn_play.setOnClickListener(this);
btn_stop.setOnClickListener(this);
btn_stop.setEnabled(false);
sb = (SeekBar) findViewById(R.id.sb);
sb.setOnSeekBarChangeListener(this);
time = (TextView) findViewById(R.id.time);
//已经做了预加载
//同步预加载
// mediaPlayer.start();
// mediaPlayer.pause();
// mediaPlayer.stop();
}
@Override
protected void onDestroy() {
super.onDestroy();
stop();
}
public void stop() {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
btn_stop.setEnabled(false);
btn_play.setText("播放");
sb.setProgress(0);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_play:
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(this, R.raw.beyond_bzyy);
//加载完毕后,知道音乐的时常
Log.e("TAG", mediaPlayer.getDuration() + " ----");
sb.setMax(mediaPlayer.getDuration() / 1000);
mediaPlayer.start();
startTime();
btn_play.setText("暂停");
btn_stop.setEnabled(true);
} else {
//播放与暂停
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
timer.cancel();
btn_play.setText("继续");
} else {
mediaPlayer.start();
startTime();
btn_play.setText("暂停");
}
}
break;
case R.id.btn_stop:
stop();
timer.cancel();
break;
}
}
Timer timer;
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
public void startTime() {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
sb.setProgress(sb.getProgress() + 1);
long len = sb.getProgress() * 1000;
time.setText(format.format(new Date(len)) + "/" + format.format(new Date(mediaPlayer.getDuration())));
}
});
}
}, 1000, 1000);
}
boolean fromUser;
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
this.fromUser = fromUser;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
fromUser = false;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if (fromUser) {
int time = seekBar.getProgress() * 1000;
mediaPlayer.seekTo(time);
}
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/btn_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止" />
<SeekBar
android:id="@+id/sb"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="00:00/00:00" />
</LinearLayout>
需要注意,在res目录下新建raw文件夹,把音乐或视频放在raw里面
声音池的用法
public class MainActivity extends AppCompatActivity {
MediaPlayer mp;
SoundPool soundPool;
HashMap<Integer, Integer> map = new HashMap<>();
// SparseIntArray == HashMap<Integer, Integer>
// SparseBooleanArray == HashMap<Integer,Boolean>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//构造
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
//加载资源 异步
map.put(1, soundPool.load(this, R.raw.chimes, 100));
map.put(2, soundPool.load(this, R.raw.ding, 100));
map.put(3, soundPool.load(this, R.raw.enter, 100));
map.put(4, soundPool.load(this, R.raw.notify, 100));
map.put(5, soundPool.load(this, R.raw.ringout, 100));
//不能在这里播放
// int id = soundPool.load(this, R.raw.chimes, 100);
// soundPool.load(this, R.raw.ding, 100);
// soundPool.load(this, R.raw.enter, 100);
// soundPool.load(this, R.raw.notify, 100);
// soundPool.load(this, R.raw.ringout, 100);
}
public void play(View v) {
mp = new MediaPlayer();
//设置
try {
mp.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath() + "/themass.mp3");
//预加载
//同步方法,如果歌曲小
long start = System.currentTimeMillis();
mp.prepare();
System.out.println("---------------" + (System.currentTimeMillis() - start));
mp.start();
//异步需要设置监听
// mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// @Override
// public void onPrepared(MediaPlayer mp) {
// mp.start();
// }
// });
// //异步加载方法
// mp.prepareAsync();
// mp.setOnSeekCompleteListener();
} catch (IOException e) {
e.printStackTrace();
}
}
//下面是点击事件
public void play1(View v) {
soundPool.play(map.get(1), 1, 1, 0, 0, 1);
}
public void play2(View v) {
soundPool.play(map.get(2), 1, 1, 0, 0, 1);
}
public void play3(View v) {
soundPool.play(map.get(3), 1, 1, 0, 0, 1);
}
public void play4(View v) {
soundPool.play(map.get(4), 1, 1, 0, 0, 1);
}
public void play5(View v) {
soundPool.play(map.get(5), 1, 1, 0, 0, 1);
}
}
下面是播放视频
public class MainActivity extends AppCompatActivity {
VideoView vv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vv = (VideoView) findViewById(R.id.vv);
//播放的是存储器根目录下的mp4格式的
vv.setVideoPath(Environment.getExternalStorageDirectory().getAbsolutePath() + "/hd.mp4");
//创建一个控制器
MediaController mc = new MediaController(this);
vv.setMediaController(mc);
vv.start();
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="com.example.videoview_11_2.MainActivity">
<VideoView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/vv"/>
</RelativeLayout>