我正在尝试制作一个简单的Android应用程序,将实时麦克风音频流式传输到服务器进行播放.产生的播放听起来很奇怪,音频间隙很大.有谁知道我做错了什么?
编辑:解决了.结果我假设每个传入的缓冲区都会完全填满,这是我的错误假设.
这是我的活动:
public class MainActivity extends Activity {
private static String TAG = "AudioClient";
// the server information
private static final String SERVER = "xx.xx.xx.xx";
private static final int PORT = 50005;
// the audio recording options
private static final int RECORDING_RATE = 44100;
private static final int CHANNEL = AudioFormat.CHANNEL_IN_MONO;
private static final int FORMAT = AudioFormat.ENCODING_PCM_16BIT;
// the button the user presses to send the audio stream to the server
private Button sendAudioButton;
// the audio recorder …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多关于Android的AudioRecorder的网页.您可以在问题下方看到它们的列表.
我正在尝试使用AudioRecorder录制音频,但效果不佳.
public class MainActivity extends Activity {
AudioRecord ar = null;
int buffsize = 0;
int blockSize = 256;
boolean isRecording = false;
private Thread recordingThread = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void baslat(View v)
{
// when click to START
buffsize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
ar = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, buffsize);
ar.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable() {
public void run() {
writeAudioDataToFile();
}
}, "AudioRecorder Thread"); …Run Code Online (Sandbox Code Playgroud) 我在使用AudioRecord类时遇到了一些问题.我想将记录的数据存储在缓冲区中,但我不确定实现它的正确方法是什么.我经历了大量的例子,但大多数都是复杂的,代表了许多不同的方法.我正在寻找简单或简单的解释.
以下是我的项目的音频设置:
int audioSource = AudioSource.MIC;
int sampleRateInHz = 8000;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
short[] buffer = new short[bufferSizeInBytes];
AudioRecord audioRecorder = new AudioRecord(audioSource,
sampleRateInHz,
channelConfig,
audioFormat,
bufferSizeInBytes);
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建录音功能:
public void Recording() {
audioRecorder.startRecording();
...
audioRecorder.stop();
audioRecorder.release();
}
Run Code Online (Sandbox Code Playgroud)
我知道我应该使用.read(short [] audioData,int offsetInShorts,int sizeInShorts)函数.在这里我的问题开始了.我不确定audioData缓冲区是如何工作的 - 我假设函数将记录的样本放入audioData中.如果它完全充满数据会发生什么?它从最早的位置开始重写?如果确实如此,我相信我必须将所有收集的样本复制到其他地方.它提出了另一个问题 - 如何检查.read(...)函数缓冲区是否已满?我是否需要测量时间和复制缓冲区内容,还是有另一种方法可以实现这一目标?我还需要为整个录制操作创建一个线程吗?
很抱歉在一个主题中问了这么多问题:)
我正在开发一个功能,当按下按钮时,它将启动语音识别,同时记录用户说的内容.代码如下:
button_start.setOnTouchListener( new View.OnTouchListener()
{
@Override
public boolean onTouch(View arg0, MotionEvent event)
{
if (pressed == false)
{
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test");
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh-HK");
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1);
sr.startListening(intent);
Log.i("111111","11111111");
pressed = true;
}
recordAudio();
}
if((event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL))
{
stopRecording();
}
return false;
}
});
}
public void recordAudio()
{
isRecording = true;
try
{
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setOutputFile(audioFilePath);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.prepare();
}
catch (Exception e)
{
e.printStackTrace();
}
mediaRecorder.start();
}
public void stopRecording()
{
if (isRecording) …Run Code Online (Sandbox Code Playgroud) 我已经尝试将代码简化为最低限度,但它仍然无效:
public class MainActivity extends AppCompatActivity {
AudioRecord rec;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rec= new AudioRecord(MediaRecorder.AudioSource.MIC,44100, AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT,8192);
short buff[] = new short[8192];
int read = rec.read(buff,0,buff.length);
System.out.print(read);
}
Run Code Online (Sandbox Code Playgroud)
无论如何,总是返回-3.我错过了什么?
我正在努力如何从连接的USB麦克风捕获音频流.我曾尝试使用MediaCapturewith MediaRecorder.AudioSource.MIC作为源,但录音质量对我来说并不是很有用,你无法确定音频源是USB还是内置设备麦克风.我需要的是使用USB音频功能,但到目前为止我无法取得任何进展.
使用第三方库对我来说太过分了,因为我只需要从麦克风接收音频数据流,其余的处理工作已经完成并正常工作,只有音频源是问题.
生成一个连接的USB设备列表 UsbConstants.USB_CLASS_AUDIO
private static final String ACTION_USB_PERMISSION = PACKAGE_NAME + ".USB_PERMISSION";
private UsbManager mUsbManAndroid;
private Map<String, UsbDevice> mAndroidDeviceMap;
private PendingIntent mPermissionIntent;
private ArrayList<UsbDeviceListItem> getUSBDevicesList() {
// Enumerate USB devices
mAndroidDeviceMap = mUsbManAndroid.getDeviceList();
ArrayList<UsbDeviceListItem> usbDevicesList = new ArrayList<>();
for (String key : mAndroidDeviceMap.keySet()) {
UsbDevice device = mAndroidDeviceMap.get(key);
// Check the device class
if (device.getDeviceClass() == UsbConstants.USB_CLASS_AUDIO) {
usbDevicesList.add(usbDeviceToListItem(key, device));
} else if (device.getDeviceClass() == UsbConstants.USB_CLASS_PER_INTERFACE) {
UsbInterface interface;
for …Run Code Online (Sandbox Code Playgroud)