音频的播放和录制
之前介绍的音频的播放使用的是MediaPlayer来播放一些歌曲之类的音频文件,而普通的铃声提示音之类的段音频用它来播放就比较浪费资源了,这里提供一个SoundPool的类来进行短音频的播放
这里只需要在界面上显示一个按钮即可,点击时候可以有播放插入进去的提示音即可
package com.example.administrator.mysoundpool;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button mButtonSoundPool;
private SoundPool pool=null;
int voiceID=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
voiceID= soundPoolPlay();
mButtonSoundPool= (Button) findViewById(R.id.button_soundPool);
mButtonSoundPool.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pool.play(voiceID,1,1,0,-1,1);
}
});
}
private int soundPoolPlay(){
if (Build.VERSION.SDK_INT>=21){
SoundPool.Builder builder=new SoundPool.Builder();
builder.setMaxStreams(2);
AudioAttributes.Builder attributes=new AudioAttributes.Builder();
attributes.setLegacyStreamType(AudioManager.STREAM_MUSIC);
builder.setAudioAttributes(attributes.build());
pool=builder.build();
}else{
pool=new SoundPool(2,AudioManager.STREAM_MUSIC,0);
}
return pool.load(getApplicationContext(),R.raw.outgoing,1);
}
}
soundPoolPlay()方法主要是用来对soundPool进行一系列的限制,这里需要注意的是sdk版本不同方法不同
API21以下的可以使用其对象直接传入三个参数即可,三个参数分别是:
maxStream —— 同时播放的流的最大数量
streamType —— 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出)
srcQuality —— 采样率转化质量,当前无效果,使用0作为默认值
API21以上的就比较麻烦了,但是思路还是一样的,都是设置他的参数,需要使用builder方法。
然后通过load方法加载音频资源
final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
priority —— 流的优先级,值越大优先级高,影响当同时播放数量超出了最大支持数时SoundPool对该流的处理;
loop —— 循环播放的次数,0为值播放一次,-1为无限循环,其他值为播放loop+1次(例如,3为一共播放4次).
rate —— 播放的速率,范围0.5-2.0(0.5为一半速率,1.0为正常速率,2.0为两倍速率)
参考:
http://blog.csdn.net/qduningning/article/details/8680575
音频的录制
在界面上设置两个按钮,一个用来开始录制,一个用来停止录制
package com.example.administrator.mymediarecoder;
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class MainActivity extends Activity implements View.OnClickListener{
private Button mButtonStartRecode;
private Button mButtonStopRecode;
private MediaRecorder mediaRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonStartRecode= (Button) findViewById(R.id.button_startrecode);
mButtonStartRecode.setOnClickListener(this);
mButtonStopRecode= (Button) findViewById(R.id.button_stoprecode);
mButtonStopRecode.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_startrecode:
mediaRecorder=new MediaRecorder();
//音频来源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//音频输出格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//音频编码格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory()+"/MyFirstRecode.MP4");
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.button_stoprecode:
if (mediaRecorder!=null){
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
}
break;
default:
break;
}
}
}
视频播放
package com.example.administrator.myvideoplay;
import android.app.Activity;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;
public class MainActivity extends Activity {
private Button mButtonVideoPlay;
private VideoView mVideoView;
//VideoView 是android 系统提供的一个媒体播放显示和控制的控件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mVideoView= (VideoView) findViewById(R.id.videoview);
mButtonVideoPlay= (Button) findViewById(R.id.button_videoplay);
mButtonVideoPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//找到视频地址,还可以通过setVideoUri来找到
mVideoView.setVideoPath(Environment.getExternalStorageDirectory()+"/DCIM/Camera/video_20150803_164216.mp4");
mVideoView.setMediaController(new MediaController(MainActivity.this));
mVideoView.start();
}
});
}
}
MediaController包含了一些典型的按钮,像”播放(Play)/暂停(Pause)”, “倒带(Rewind)”, “快进(Fast Forward)”与进度滑动器(progress slider)。它管理媒体播放器(MediaController)的状态以保持控件的同步。
此外我们还可以使用 SurfaceView来播放视频等,SurfaceView 是个非常重要的绘图容器。
package com.example.administrator.mysurfaceview;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private Button mButtonSurfaceView;
private SurfaceView mSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonSurfaceView= (Button) findViewById(R.id.button_surfaceView);
mSurfaceView= (SurfaceView) findViewById(R.id.surfaceView);
mButtonSurfaceView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MediaPlayer player=new MediaPlayer();
try {
player.setDataSource(Environment.getExternalStorageDirectory()+"/DCIM/Camera/20150423_1707326.3gp");
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDisplay(mSurfaceView.getHolder());
player.prepare();
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
相机
package com.example.administrator.mycarame;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.File;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private Button mButtonCamera;
private ImageView mImageView;
private File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonCamera= (Button) findViewById(R.id.button_startcamera);
mImageView= (ImageView) findViewById(R.id.image_photo);
mButtonCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
if (file==null){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));//告诉相机图片保存的位置
startActivityForResult(intent,0x23);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0x23){
if(resultCode==RESULT_OK){
mImageView.setImageURI(Uri.fromFile(file));
}
}
}
}