您的位置:首页 > 移动开发 > Android开发

Android音频开发之使用MediaRecorder录制

2016-12-30 19:03 459 查看
本文主要是记录Android端音频开发

Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord

MediaRecorder 可以直接把手机麦克风录入的音频数据进行编码压缩(如AMR、MP3,3gp等)并存成文件

google API : https://developer.android.com/reference/android/media/MediaRecorder.html

关于播放,Android SDK 提供了3套音频播放的API,分别是:MediaPlayer,SoundPool,AudioTrack,MediaPlayer 更加适合在后台长时间播放本地音乐文件或者在线的流式资源; SoundPool 则适合播放比较短的音频片段,比如游戏声音、按键声、铃声片段等等,它可以同时播放多个音频; 而 AudioTrack 则更接近底层,提供了非常强大的控制能力,支持低延迟播放,适合流媒体等场景

使用比较简单,直接上简单例子,本例播放使用MediaPlayer ,MediareRcorder 还可以用于录制视频

import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.cl.slack.mediarecorder.R;

import java.io.IOException;

import static android.Manifest.permission.RECORD_AUDIO;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

public class MediaRecorderAudioActivity extends AppCompatActivity
implements View.OnClickListener {

private final int REQ_PERMISSION_AUDIO = 0x01;
private Button mRecode, mPlay;
private String mAudioPath = null;
private MediaRecorder mMediaRecorder;
private MediaPlayer mMediaPlayer;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_recorder_audio);

mRecode = (Button) findViewById(R.id.audio_recode);
mPlay = (Button) findViewById(R.id.audio_paly);

mRecode.setText("recode");
mPlay.setText("play");

mPlay.setEnabled(false);

mRecode.setOnClickListener(this);
mPlay.setOnClickListener(this);

mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mMediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);

mMediaPlayer = new MediaPlayer();
}

@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.audio_recode:
if(mRecode.getTag() == null){
startAudioRecode();
}else {
stopAudioRecode();
}
break;
case R.id.audio_paly:
if(mPlay.getTag() == null){
startAudioPlay();
}else {
stopAudioPlay();
}
break;
}
}

private void startAudioRecode() {
if(checkPermission()){
PackageManager packageManager = this.getPackageManager();
if (!packageManager.hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
showToast("This device doesn't have a mic!");
return;
}
mRecode.setTag(this);
mRecode.setText("stop");
mPlay.setEnabled(false);

mAudioPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
"audioRecord.mp3";
mMediaRecorder.setOutputFile(mAudioPath);

try {
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

showToast("Recording started");

}else {
requestPermission();
}
}

private void stopAudioRecode() {
mRecode.setTag(null);
mRecode.setText("recode");
mMediaRecorder.stop();
mMediaRecorder.reset();
mPlay.setEnabled(true);
showToast("Recording Completed");
}

private void startAudioPlay() {
mPlay.setTag(this);
mPlay.setText("stop");
try {
mMediaPlayer.setDataSource(mAudioPath);
mMediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}

mMediaPlayer.start();
showToast("Recording Playing");
}

private void stopAudioPlay() {
mPlay.setTag(null);
mPlay.setText("play");
mMediaPlayer.stop();
mMediaPlayer.reset();
}

private boolean checkPermission() {
int result = ContextCompat.checkSelfPermission(getApplicationContext(),
WRITE_EXTERNAL_STORAGE);
int result1 = ContextCompat.checkSelfPermission(getApplicationContext(),
RECORD_AUDIO);
return result == PackageManager.PERMISSION_GRANTED &&
result1 == PackageManager.PERMISSION_GRANTED;
}

private void requestPermission() {
ActivityCompat.requestPermissions(this, new
String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, REQ_PERMISSION_AUDIO);
}

@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQ_PERMISSION_AUDIO:
if (grantResults.length > 0) {
boolean StoragePermission = grantResults[0] ==
PackageManager.PERMISSION_GRANTED;
boolean RecordPermission = grantResults[1] ==
PackageManager.PERMISSION_GRANTED;

if (StoragePermission && RecordPermission) {
showToast("Permission Granted");
} else {
showToast("Permission  Denied");
}
}
break;
}
}

private void showToast(String message){
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}


Ui 就两个按钮

<?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_media_recorder_audio"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:gravity="center"
tools:context="com.cl.slack.MediaRecorderAudioActivity">

<Button
android:id="@+id/audio_recode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="recode"/>

<Button
android:id="@+id/audio_paly"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="play"/>

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Audio