请帮忙看看这个程序哪里有问题,为什么在 run 里检查 dstat 的值始终是没有初始化?谢谢!
package com.AudioTest;import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class AudioTestActivity extends Activity {
private Button record;
private Button play;
AudioRecord audioRecord;
int recBufSize;
int frequency =8000;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; boolean isRecording = false;// 是否录放的标记
Thread recordThread=null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
record = (Button) findViewById(R.id.record);
play = (Button) findViewById(R.id.play);
record.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(record.getTag()==null || !record.getTag().equals("ing"))
{
start();
}
else
{
// stopAndSave();
}
}
});
} public void start()
{
Log.e("test", "test");
recBufSize = AudioRecord.getMinBufferSize(frequency,
channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
frequency, channelConfiguration, audioEncoding,
recBufSize);
isRecording = true;
recordThread = new AudioRecordThread();
recordThread.start();
}
class AudioRecordThread extends Thread
{
public void run()
{
try
{
byte[] buffer = new byte[recBufSize];
int rstat=audioRecord.getRecordingState();
int dstat=audioRecord.getState();
if(dstat!=AudioRecord.STATE_INITIALIZED)
{
Log.e("test", "AudioRecord state is not successfully initialized. rstat="+rstat+" dstat="+dstat);
return;
} audioRecord.startRecording();// 开始录制
while (isRecording)
{
int bufferReadResult = audioRecord.read(buffer, 0, 320);
Thread.sleep(1);
}
audioRecord.stop();
}
catch (Throwable t)
{
Log.w("test", "audio record stop");
}
finally
{
audioRecord.release();
audioRecord=null;
}
}
}
}
package com.AudioTest;import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class AudioTestActivity extends Activity {
private Button record;
private Button play;
AudioRecord audioRecord;
int recBufSize;
int frequency =8000;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; boolean isRecording = false;// 是否录放的标记
Thread recordThread=null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
record = (Button) findViewById(R.id.record);
play = (Button) findViewById(R.id.play);
record.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(record.getTag()==null || !record.getTag().equals("ing"))
{
start();
}
else
{
// stopAndSave();
}
}
});
} public void start()
{
Log.e("test", "test");
recBufSize = AudioRecord.getMinBufferSize(frequency,
channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
frequency, channelConfiguration, audioEncoding,
recBufSize);
isRecording = true;
recordThread = new AudioRecordThread();
recordThread.start();
}
class AudioRecordThread extends Thread
{
public void run()
{
try
{
byte[] buffer = new byte[recBufSize];
int rstat=audioRecord.getRecordingState();
int dstat=audioRecord.getState();
if(dstat!=AudioRecord.STATE_INITIALIZED)
{
Log.e("test", "AudioRecord state is not successfully initialized. rstat="+rstat+" dstat="+dstat);
return;
} audioRecord.startRecording();// 开始录制
while (isRecording)
{
int bufferReadResult = audioRecord.read(buffer, 0, 320);
Thread.sleep(1);
}
audioRecord.stop();
}
catch (Throwable t)
{
Log.w("test", "audio record stop");
}
finally
{
audioRecord.release();
audioRecord=null;
}
}
}
}
那这个dstat是什么状态?获取到值了吗?
import android.media.AudioRecord;
import android.media.MediaRecorder;public class PcmRecorder implements Runnable { private volatile boolean isRecording;
private final Object mutex = new Object();// 对象,用来设置线程上锁的锁定对象。
private static final int frequency = 8000;// 采样率,单位围Hz
// 该格式的音频数据为代表.音频数据格式:PCM 16位每个样本。保证是支持设备。
private static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; public PcmRecorder() {
super();
} public void run() {
Encoder encoder = new Encoder();
Thread encodeThread = new Thread(encoder);
encoder.setRecording(true);// 设置线程当前状态。
encodeThread.start();// 开始编码
synchronized (mutex) {// 对象上锁
while (!this.isRecording) {
try {
mutex.wait();
} catch (InterruptedException e) {
throw new IllegalStateException("Wait() 打断了!", e);
}
}
}
// 设置线程的优先级,优先考虑最重要的音频线程。
android.os.Process
.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int bufferRead = 0;
// 返回所需最低缓冲区大小的从成功建立AudioRecord对象。
// 注意这个尺寸大小并不保证其顺利记录加载方式,
// 和更高的价值应选用根据预期的频率的AudioRecord实例将调查为新数据。
int bufferSize = AudioRecord.getMinBufferSize(frequency,
AudioFormat.CHANNEL_IN_MONO, audioEncoding);
// AudioFormat.CHANNEL_IN_MONO音频的配置
short[] tempBuffer = new short[bufferSize];
/*
* 下面的bufferSize是 (字节单位)在写入录音的时候的音频的总缓冲区大小。
*/
AudioRecord recordInstance = new AudioRecord(
MediaRecorder.AudioSource.MIC, frequency,
AudioFormat.CHANNEL_IN_MONO, audioEncoding, bufferSize);
recordInstance.startRecording();// 开始录音
while (this.isRecording) {
// bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
// 读取音频数据来自的音频硬件,记录到一个缓冲区。
bufferRead = recordInstance.read(tempBuffer, 0, 640);// 录音数据被写入tempBuffer数组
if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION) {
throw new IllegalStateException(
"read() returned AudioRecord.ERROR_INVALID_OPERATION");
} else if (bufferRead == AudioRecord.ERROR_BAD_VALUE) {
throw new IllegalStateException(
"read() returned AudioRecord.ERROR_BAD_VALUE");
} else if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION) {
throw new IllegalStateException(
"read() returned AudioRecord.ERROR_INVALID_OPERATION");
}
if (encoder.isIdle()) {// 如果编码过来了
encoder.putData(System.currentTimeMillis(), tempBuffer,
bufferRead);// 解码数据开始
System.out.println(System.currentTimeMillis());
} else {
System.out.println("编码不过来,丢失数据!");
}
}
recordInstance.stop();// 线程完了关闭录音
encoder.setRecording(false);
} // 设置线程状态
public void setRecording(boolean isRecording) {
synchronized (mutex) {
this.isRecording = isRecording;
if (this.isRecording) {
mutex.notify();
}
}
} public boolean isRecording() {
synchronized (mutex) {
return isRecording;
}
}
}