tag:blogger.com,1999:blog-38679944483786738292024-02-20T17:40:56.800-08:00AudioRecordAndroid App Developerhttp://www.blogger.com/profile/17491988457696905535noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-3867994448378673829.post-29154269286687533272012-09-17T00:33:00.000-07:002012-10-13T04:46:10.493-07:00Audio Record Statically<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div itemprop="articleBody" style="background-color: #f9f9f9; font-family: Roboto, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 15px; text-align: -webkit-auto;">
<span style="color: #073763;">The AudioRecord class manages the audio resources for Java applications to record audio from the audio input hardware of the platform. This is achieved by "pulling" (reading) the data from the AudioRecord object. The application is responsible for polling the AudioRecord object in time using one of the following three methods: <code style="font-family: 'courier new', courier, monospace; font-weight: bold; line-height: 1.5;"><a href="http://developer.android.com/reference/android/media/AudioRecord.html#read(byte[], int, int)" style="text-decoration: none;">read(byte[], int, int)</a></code>, <code style="font-family: 'courier new', courier, monospace; font-weight: bold; line-height: 1.5;"><a href="http://developer.android.com/reference/android/media/AudioRecord.html#read(short[], int, int)" style="text-decoration: none;">read(short[], int, int)</a></code> or <code style="font-family: 'courier new', courier, monospace; font-weight: bold; line-height: 1.5;"><a href="http://developer.android.com/reference/android/media/AudioRecord.html#read(java.nio.ByteBuffer, int)" style="text-decoration: none;">read(ByteBuffer, int)</a></code>. The choice of which method to use will be based on the audio data storage format that is the most convenient for the user of AudioRecord.</span></div>
<div style="background-color: #f9f9f9; font-family: Roboto, sans-serif; font-size: 14px; line-height: 19px; margin-bottom: 15px; text-align: -webkit-auto;">
<span style="color: #073763;">Upon creation, an AudioRecord object initializes its associated audio buffer that it will fill with the new audio data. The size of this buffer, specified during the construction, determines how long an AudioRecord can record before "over-running" data that has not been read yet. Data should be read from the audio hardware in chunks of sizes inferior to the total recording buffer size.</span></div>
<br />
import java.io.FileNotFoundException;<br />
import java.io.FileOutputStream;<br />
import java.io.IOException;<br />
import android.app.Activity;<br />
import android.media.AudioFormat;<br />
import android.media.AudioRecord;<br />
import android.media.MediaRecorder;<br />
import android.os.Bundle;<br />
import android.view.KeyEvent;<br />
import android.view.View;<br />
import android.widget.Button;<br />
<br />
/**<br />
*<br />
* @author RAHUL BARADIA<br />
*<br />
*<br />
*/<br />
public class Audio_Record extends Activity {<br />
private static final int RECORDER_SAMPLERATE = 8000;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
private AudioRecord recorder = null;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private Thread recordingThread = null;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private boolean isRecording = false;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Override<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void onCreate(Bundle savedInstanceState) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>super.onCreate(savedInstanceState);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>setContentView(R.layout.main);<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>setButtonHandlers();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>enableButtons(false);<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private void setButtonHandlers() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private void enableButton(int id, boolean isEnable) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button) findViewById(id)).setEnabled(isEnable);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private void enableButtons(boolean isRecording) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>enableButton(R.id.btnStart, !isRecording);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>enableButton(R.id.btnStop, isRecording);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int BufferElements2Rec = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int BytesPerElement = 2; // 2 bytes in 16bit format<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private void startRecording() {<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>RECORDER_SAMPLERATE, RECORDER_CHANNELS,<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>recorder.startRecording();<br />
<span style="background-color: #f9f9f9; color: #222222; font-family: Roboto, sans-serif; font-size: 14px; line-height: 19px; text-align: -webkit-auto;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>isRecording = true;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>recordingThread = new Thread(new Runnable() {<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void run() {<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>writeAudioDataToFile();<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}, "AudioRecorder Thread");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>recordingThread.start();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
//Conversion of short to byte<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private byte[] short2byte(short[] sData) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int shortArrsize = sData.length;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>byte[] bytes = new byte[shortArrsize * 2];<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>for (int i = 0; i < shortArrsize; i++) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>bytes[i * 2] = (byte) (sData[i] & 0x00FF);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>sData[i] = 0;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return bytes;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private void writeAudioDataToFile() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// Write the output audio in byte<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>String filePath = "/sdcard/8k16bitMono.pcm";<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
short sData[] = new short[BufferElements2Rec];<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>FileOutputStream os = null;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>os = new FileOutputStream(filePath);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (FileNotFoundException e) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>e.printStackTrace();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>while (isRecording) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// gets the voice output from microphone to byte format<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>recorder.read(sData, 0, BufferElements2Rec);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>System.out.println("Short wirting to file" + sData.toString());<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// writes the data to file from buffer stores the voice buffer<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>byte bData[] = short2byte(sData);<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>os.write(bData, 0, BufferElements2Rec * BytesPerElement);<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (IOException e) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>e.printStackTrace();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>os.close();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (IOException e) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>e.printStackTrace();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private void stopRecording() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// stops the recording activity<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (null != recorder) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>isRecording = false;<br />
<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>recorder.stop();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>recorder.release();<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>recorder = null;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>recordingThread = null;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private View.OnClickListener btnClick = new View.OnClickListener() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void onClick(View v) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>switch (v.getId()) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case R.id.btnStart: {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>enableButtons(true);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>startRecording();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case R.id.btnStop: {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>enableButtons(false);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>stopRecording();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>};<br />
<br />
// onClick of backbutton finishes the activity.<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Override<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public boolean onKeyDown(int keyCode, KeyEvent event) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (keyCode == KeyEvent.KEYCODE_BACK) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>finish();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return super.onKeyDown(keyCode, event);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
}</div>
Android App Developerhttp://www.blogger.com/profile/17491988457696905535noreply@blogger.com4