gpt4 book ai didi

android - 麦克风输入的处理

转载 作者:太空狗 更新时间:2023-10-29 13:39:51 25 4
gpt4 key购买 nike

我正在尝试从麦克风获取音频数据。我通过使用 AudioRecord 类实现了这一点,该类填充了类型为 shorts 的缓冲区。

最后,我想绘制此缓冲区的图形,以便获得类似显示(实时信息)的示波器。问题是,如果我想显示一个值(比如文本),那么我需要一个不同的线程来更新 UI。目前,我通过使用 AsyncTask 并使用 AsyncTasks.publishProgress() 更新 UI 来执行此操作。到目前为止,我还不是很成功,想知道我是否在正确的轨道上? handle 是更好的方法吗?有没有人以前做过类似的事情,如果有的话,哪种方法对你有用?另外,是否可以简单地轮询麦克风?


这是我的代码。它旨在输出来自 MIC 的每个读取样本。它似乎以可接受的速度执行此操作,但偶尔会显示零。为什么?

package com.ss.audioacquireapp3;

import android.app.Activity;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;


public class AudioAcquireApp3Activity extends Activity
{
//Properties (AsyncTask)
protected TextView _percentField;
protected InitTask _initTask;

//Properties (MIC)
public AudioRecord audioRecord;
public int mSamplesRead; //how many samples read
public int recordingState;
public int buffersizebytes;
public int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
public int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
public static short[] buffer; //+-32767
public static final int SAMPPERSEC = 44100; //samp per sec 8000, 11025, 22050 44100 or 48000

@Override
public void onCreate( Bundle savedInstanceState )
{
super.onCreate(savedInstanceState);
setContentView( R.layout.main );

_percentField = ( TextView ) findViewById( R.id.percent_field );

buffersizebytes = AudioRecord.getMinBufferSize(SAMPPERSEC,channelConfiguration,audioEncoding); //4096 on ion
buffer = new short[buffersizebytes];
audioRecord = new AudioRecord(android.media.MediaRecorder.AudioSource.MIC,SAMPPERSEC,channelConfiguration,audioEncoding,buffersizebytes); //constructor

_initTask = new InitTask();
_initTask.execute( this );
}

/**
* sub-class of AsyncTask
*/
protected class InitTask extends AsyncTask<Context, Integer, String>
{
// -- run intensive processes here
// -- notice that the datatype of the first param in the class definition matches the param passed to this method
// -- and that the datatype of the last param in the class definition matches the return type of this method
@Override
protected String doInBackground( Context... params )
{
//-- on every iteration
//-- runs a while loop that causes the thread to sleep for 50 milliseconds
//-- publishes the progress - calls the onProgressUpdate handler defined below
//-- and increments the counter variable i by one
//int i = 0;

audioRecord.startRecording();

while( true )
{
try{
mSamplesRead = audioRecord.read(buffer, 0, buffersizebytes);

int amp;

for(int i = 0; i < buffersizebytes - 1; i++){
amp = (int)buffer[i];
publishProgress( amp );
}

} catch( Exception e ){
}
}
}

// -- gets called just before thread begins
@Override
protected void onPreExecute()
{
//Log.i( "makemachine", "onPreExecute()" );
super.onPreExecute();

}

// -- called from the publish progress
// -- notice that the datatype of the second param gets passed to this method
@Override
protected void onProgressUpdate(Integer... values)
{
super.onProgressUpdate(values);
//Log.i( "makemachine", "onProgressUpdate(): " + String.valueOf( values[0] ) );
_percentField.setText( String.valueOf(values[0]) );
}

// -- called as soon as doInBackground method completes
// -- notice that the third param gets passed to this method
@Override
protected void onPostExecute( String result )
{
super.onPostExecute(result);
//Log.i( "makemachine", "onPostExecute(): " + result );
}


}
}

这是main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical|center_horizontal"
>

<TextView android:id="@+id/percent_field"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>

</LinearLayout>

注意你需要把这个添加到AndroidManifest.xml

<uses-permission android:name="android.permission.RECORD_AUDIO" />

我在 LG Optimus Black 上运行它。请帮助我使这段代码尽可能高效。

最佳答案

  1. 如果您需要从任何线程更新 UI 线程,您可以始终使用 Activity.runOnUiThread(Runnable action)。有关详细信息,请参阅 Activity 类 javadoc。
  2. 我不确定您所说的“简单轮询麦克风”到底是什么意思,但我认为 AudioRecord 是录制麦克风的好方法。这是示例实现的链接,它实时读取录制音频的频率:http://www.anddev.org/novice-tutorials-f8/get-frequency-data-from-microphone-in-real-time-t16774.html

希望这对您有所帮助。

关于android - 麦克风输入的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7056748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com