- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 AudioRecord 类录制音频。我想将音频录制到我的 Assets 文件夹或资源文件夹中的特定文件中。我认为录制没有问题。但是在读取缓冲区时它显示出一些问题(它正在抛出NullPointerException)。任何人都可以提出可能是什么问题吗?
最佳答案
您不能将文件保存在 Asset 文件夹中。 Assets 文件夹是只读的,您必须将其保存在设备的内部或外部存储中
下面有一个内核来记录媒体文件。
package com.example.media.record;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
public class MediaRecorderActivity extends Activity implements OnClickListener {
Button btnPlay;
Button btnRecord;
ProgressBar progress;
MediaPlayer mPlayer;
MediaRecorder mRecorder;
String mFileName;
boolean mStartRecording = true;
boolean mStartPlaying = true;
Thread mThreadProgress;
int duration = 1;
private void onRecord(boolean start) {
if(start) {
startRecording();
}else {
stopRecording();
}
}
private void onPlay(boolean start) {
if(start) {
startPlaying();
}else {
stopPlaying();
}
}
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFile(mFileName);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOnErrorListener(errorListenerForRecorder);
try {
mRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
mRecorder.start();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Error :: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
private void stopRecording() {
if(mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
private void startPlaying() {
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(mFileName);
mPlayer.setOnCompletionListener(completionListener);
mPlayer.setOnErrorListener(errorListenerForPlayer);
mPlayer.prepare();
mPlayer.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void stopPlaying() {
if(mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
}
OnCompletionListener completionListener = new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
btnRecord.setEnabled(true);
btnPlay.setText("Start playing");
mStartPlaying = !mStartPlaying;
}
};
OnErrorListener errorListenerForPlayer = new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Toast.makeText(getApplicationContext(), "Error during playing file", 3000).show();
return false;
}
};
android.media.MediaRecorder.OnErrorListener errorListenerForRecorder = new android.media.MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
Toast.makeText(getApplicationContext(), "Error during recoding file", 3000).show();
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnPlay = (Button)findViewById(R.id.btnPlay);
btnRecord = (Button)findViewById(R.id.btnRecord);
progress = (ProgressBar)findViewById(R.id.progressRecorder);
mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName += "/audiorecordtest.3gp";
File file = new File(mFileName);
if(!file.exists()) btnPlay.setEnabled(false);
btnPlay.setOnClickListener(this);
btnRecord.setOnClickListener(this);
}
@Override
protected void onPause() {
super.onPause();
if(mRecorder != null) {
mRecorder.stop();
}
if(mPlayer != null) {
mPlayer.pause();
}
}
@Override
protected void onResume() {
super.onResume();
if(mRecorder != null) {
mRecorder.start();
}
if(mPlayer != null) {
mPlayer.start();
}
}
@Override
protected void onStop() {
super.onStop();
if(mRecorder != null) {
mRecorder.stop();
}
if(mPlayer != null) {
mPlayer.stop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mRecorder != null) {
mRecorder.release();
mRecorder = null;
}
if(mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
@Override
public void onClick(View v) {
if(v == btnPlay) {
onPlay(mStartPlaying);
if(mStartPlaying) {
duration = mPlayer.getDuration();
mThreadProgress = new ThreadProgress();
mThreadProgress.start();
((Button)v).setText("Stop Playing");
btnRecord.setEnabled(false);
}
else {
((Button)v).setText("Start Playing");
btnRecord.setEnabled(true);
if(mThreadProgress != null && !mThreadProgress.isAlive()) mThreadProgress.stop();
// t.interrupt();
}
mStartPlaying = !mStartPlaying;
} else if(v == btnRecord) {
onRecord(mStartRecording);
if(mStartRecording) {
mThreadProgress = new ThreadProgress();
mThreadProgress.start();
((Button)v).setText("Stop Recording");
btnPlay.setEnabled(false);
// t.start();
}
else {
((Button)v).setText("Start Recording");
btnPlay.setEnabled(true);
// t.interrupt();
if(mThreadProgress != null && !mThreadProgress.isAlive()) mThreadProgress.stop();
}
mStartRecording = !mStartRecording;
}
}
Handler handler = new Handler(new Callback() {
@Override
public boolean handleMessage(final Message msg) {
if(msg.what == 0) {
runOnUiThread(new Runnable() {
public void run() {
progress.setProgress(msg.arg1);
}
});
}
return false;
}
});
public class ThreadProgress extends Thread implements Runnable {
public int i = 0;
@Override
public void run() {
while((!this.isInterrupted() && mPlayer != null && mPlayer.isPlaying()) || (!this.isInterrupted() && mRecorder != null)) {
try {
if(duration == 1) i+=1;
else i += 100000 /duration;
Message message = new Message();
message.what = 0;
message.arg1 = i;
handler.sendMessage(message);
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
这是您可以录制音频以及播放音频的示例
You can store recorded file in following places
1) File directory of your app
2) External directory(SD card)
3) Network
关于android - AudioRecord 类的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6827679/
Android:我想从麦克风读取缓冲区以便我可以对其执行处理,以下是我的代码 int sampleRateInHz = 8000;// 44100, 22050 and 11025 i
我正在尝试在我的 Android 应用程序中将音频读取为 16 位整数。我使用 Xamarin.android 编写了这个应用程序。我为此使用 AudioRecord 低级库,因为我需要从手机麦克风读
访问AudioRecord.Builder的正确方法是什么?在 JNI 级别? 类似于AudioRecord类。 (jclass)jni_env->NewGlobalRef(jni_env->Find
嗨,我正在构建一个应用程序,它将使用来自 MIC 的传入音频并将其与存储的声音文件进行比较。目前,我正试图掌握 AudioRecord 函数中的数据在保存到字节数组时的样子。我的问题是返回的值都是零。
我打算在 Android 4.4.2 设备上录制立体声音频。但是,通过简单的录音应用程序(使用 AudioRecord)录制的音频与提供的配置不匹配。如果设备使用默认配置值,我希望在 logcat 中
我已经构建了一个监听背景噪音的应用程序。我发现,在收听时,用户无法调用电话或使用任何其他录制音频的应用程序。我想知道是否有一种方法可以在通话之前同时允许录制音频或显式禁用声音?这将如何实现? 最佳答案
请同时查看我的其他问题,因为我认为它们是相关的: Question 1 Question 2 Question 3 这是我正在使用的代码,当我按下按钮时,它将麦克风获得的音频信号传递到扬声器: pub
我在使用 AudioRecord 时遇到问题。 我正在开发一个应用程序,需要记录来自 MIC 的一些脉冲响应并用它制作一些 DSP。 捕获的音频存储在 WAV 文件中,然后从该文件绘制。 我创建了一个
我已经在我的 android 应用程序中使用 Mic 进行了录音,当使用 AudioPlayer 类将数据流式传输进来时,它播放得非常好。我的问题是我想向该数据附加一个 wav header ,以便它
我正在使用 AudioRecord 类录制音频。我想将音频录制到我的 Assets 文件夹或资源文件夹中的特定文件中。我认为录制没有问题。但是在读取缓冲区时它显示出一些问题(它正在抛出NullPoin
我目前正在开始为 Android 编写一个软件,该软件将要测量封闭房间的混响时间。 我不得不选择 AudioRecord而不是 MediaRecorder因为它让我有机会获得原始数据。 您可能知道 A
我使用 AudioRecorder 记录了 50 毫秒(10-12KHz 频率)的线性调频信号。在安静的房间里,距离为 50/60 厘米时,信号频谱图如下所示 背景中有很多噪音,还有一些回声。我想知道
我在使用 AudioRecord for Android 时遇到了问题。我已经尽可能多地在网上找到有关它的信息,但我似乎无法进行良好的初始化。 我创建 AudioRecord 对象的代码是这样的:
我想录制音频并以 WAV 格式播放。我必须使用 AudioRecord 来完成。有人可以帮我吗? 我经历了这个例子, http://androidsourcecode.blogspot.com.au/
我编写了一个标准代码,用于使用 AudioRecord 从麦克风接收数据。这是我的代码: AudioReceiver() { int minHardwareBufferSize = Audio
我的实验是这样的:首先,我使用matlab创建一个指定的wave文件,速率为44100,这意味着任何持续1s的 fragment 都包含44100个元素,这些元素以double形式呈现。然后,我使用智
我只在 Motorola Milestone 上遇到这个问题。代码: // init recorder recordInstance = new AudioRecord(MediaRecorder.A
我正在努力解决这个问题,我已经更改了比特率以减小录制文件的大小,我的应用程序正确地将音频文件发布到服务器,但我想最小化文件大小,这是我的录制代码 private void startRecordin
我正在尝试使用 AudioRecord 从麦克风录制一些音频。录音有效,但音量太大,而且我的剪报很糟糕。我尝试使用 AutomaticGainControl,但它在我的设备上不可用。有没有其他方法可以
我看了很多关于 AudioRecorder 初始化问题的帖子,所以我用一个函数来测试每一种可能性。不幸的是,没有工作的。我应该检查什么? @Override public void onCreat
我是一名优秀的程序员,十分优秀!