音頻的播放和錄製
之前介紹的音頻的播放使用的是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));
}
}
}
}