Articles of audiorecord

即时音频输入和输出Android

在我的Android应用程序中,我想从智能手机的麦克风中获取一些音频并立即播放,像麦克风一样直播,没有延迟。 我目前正在考虑使用AudioRecord和AudioTrack类(从我读过的内容),但我不太清楚如何继续。 我查看了Stack Overflow上的其他一些问题,但是他们并没有完全回答我想做的事情。 大多数是2012年。 那么如何使用这些类同时输入和输出音频呢? 另外:我看过MediaRecorder API ,但是根据我的阅读,这需要你将音频保存到文件中,我不想这样做。 可以通过tweek来满足我的要求吗? 或者我最好只使用AudioRecord ? 谢谢 编辑: 以下是我在@Pradip Pramanick建议的更新代码: final Thread record = new Thread(new Runnable() { @Override public void run() { while (!Thread.interrupted()) { MediaRecorder microphone = new MediaRecorder(); microphone.setAudioSource(MediaRecorder.AudioSource.MIC); microphone.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); microphone.setOutputFile(filename); microphone.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { microphone.prepare(); } catch (IOException e) { e.printStackTrace(); } microphone.start(); } } }); […]

PCM – > AAC(编码器) – > PCM(解码器)实时正确优化

我正在努力实施 AudioRecord (MIC) -> PCM -> AAC Encoder AAC -> PCM Decode -> AudioTrack?? (SPEAKER) 使用Android 4.1+(API16)上的MediaCodec 。 首先,我成功(但不确定正确优化)实现了PCM -> AAC Encoder MediaCodec PCM -> AAC Encoder ,如下所示 private boolean setEncoder(int rate) { encoder = MediaCodec.createEncoderByType(“audio/mp4a-latm”); MediaFormat format = new MediaFormat(); format.setString(MediaFormat.KEY_MIME, “audio/mp4a-latm”); format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1); format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100); format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);//AAC-HE 64kbps format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE); encoder.configure(format, […]

使用Android SDK从原始PCM数据创建WAV文件

我正在尝试使用AudioRecord类来记录WAV文件。 问题是它只提供原始PCM数据,如果我将其写入文件,则没有标题信息,因此它不会在任何媒体播放器中播放。 如何从这些原始数据创建WAV文件? 或者,有没有其他方法将Android中的声音录制到WAV文件(或者MP3)? 哦,我知道MediaRecorder可以使用,因为它不支持WAV或MP3格式。

Android MediaCodec AAC编码器

我使用Android SDK提供的MediaCodec类,因为API级别16与OMX.SEC.aac.enc编码器一起将音频编码为文件。 我从AudioRecord类中获取音频输入。 我的AudioRecord类的实例配置如下: bufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT); recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_DEFAULT, bufferSize); 我能够从AudioRecord实例播放原始数据,因此问题不在那里。 我将AudioRecord实例的输出写入ByteBuffer实例,并将其传递给编码器的可用输入缓冲区。 编码器的输出写入SD卡上的文件。 这些是我的MediaCodec实例的配置参数: codec = MediaCodec.createEncoderByType(“audio/mp4a-latm”); MediaFormat format = new MediaFormat(); format.setString(MediaFormat.KEY_MIME, “audio/mp4a-latm”); format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024); format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2); format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100); format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE); codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); VLC告诉我,我的aac文件中没有流。 命令FFMPEG -i @filename@给出了以下错误: 处理输入时发现无效数据 。 我测试过的所有媒体播放器都无法播放我的文件。 为什么我无法播放我的文件? 我在LogCat没有收到OpenMAX错误,并且编码时应用程序不会崩溃。 我写了一个video编码器,它的工作原理与之相同。 […]

发出编码和解码audiologging为G711(PCMU – uLaw)格式

当我们需要stream式传输audio时,没有太多有关应用此编解码器的信息。 没有应用编解码器,我的代码就像一个build立2设备之间的通信魅力工作,但我需要在该格式的编码/解码,因为我需要stream服务器,而不是两个设备之间(我正在testing这个代码使用2设备)。 我正在寻找机会,如果你的任何人都可以看到我的问题的关键在哪里。 我已经尝试了input参数的不同configuration。 也许,我使用的编解码器是错误的(我使用Apache许可证从一个项目中获得了它们)。 这个值在播放器 – 接收器设备中设置在录音机 – 发送器中: private int port=50005; private int sampleRate = 8000 ;//44100; private int channelConfig = AudioFormat.CHANNEL_OUT_MONO; private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; int minBufSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat); 注意:播放器中的CHANNEL_OUT_MONO和logging器项目中的CHANNEL_IN_MONO。 这些是我的方法: public void startStreamingEncoding() { Thread streamThread = new Thread(new Runnable() { @Override public void run() { try { […]

AudioRecord和AudioTrack延迟

我试图开发一个应用程序,如android的iRig,所以第一步是捕捉麦克风input,并在同一时间播放它。 我有它,但问题是,我得到一些延迟,使这种无法使用,如果我开始处理缓冲区,我怕它会得到完全无法使用。 我使用这样的audiorecord和audiotrack: new Thread(new Runnable() { public void run() { while(mRunning){ mRecorder.read(mBuffer, 0, mBufferSize); //Todo: Apply filters here into the buffer and then play it modified mPlayer.write(mBuffer, 0, mBufferSize); //Log.v("MY AMP","ARA"); } 而通过这种方式: // ==================== INITIALIZE ========================= // public void initialize(){ mBufferSize = AudioRecord.getMinBufferSize(mHz, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); mBufferSize2 = AudioTrack.getMinBufferSize(mHz, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); mBuffer = new […]

当其他应用在Android中使用时,无法访问麦克风

我正在使用以下URL中的代码,以便从AudioRecord的麦克风获取声音数据: http : //www.dreamincode.net/forums/topic/303235-visualizing-sound-from-the-microphone/ 我看到的问题是,如果另一个应用程序也使用麦克风,我得到一个错误(状态-3)从AudioRecord。 如果我杀了使用麦克风的其他应用程序,一切都按预期工作。 是否有一个优雅的解决scheme,让我的应用程序访问麦克风,即使其他应用程序已经在使用它? 谢谢。

Android AudioRecord读取总是返回-3(ERROR_INVALID_OPERATION)

我试图简化代码到最低限度,它仍然无法正常工作: 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); } 总是返回-3无论如何。 我错过了什么?

使用Android AudioRecorder录制.Wav

我已经阅读了很多关于Android的AudioRecorder的页面。 你可以在问题下面看到他们的列表。 我试图用AudioRecorder录制audio,但效果不好。 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 […]

AudioRecord:开始()状态-38

我有以下问题:我使用SpeechRecognizer识别几个字。 我用 public void onResults 方法来销毁SpeechRecognizer。 在销毁之后,我初始化一个AudioRecord并从麦克风开始录音。 这导致我的logcat中的以下错误: 12-09 00:44:01.976: E/AudioRecord(21185): start() status -38 我的代码中没有引发exception。 AudioRecord只是无法正常启动。 我假设SpeechRecognizer不会很快释放麦克风,因为如果我在AudioRecord的初始化之前添加Thread.sleep(200),我不会遇到此问题。 这个解决scheme非常糟糕,原因很明显。 因此,我有以下问题: 如何检查AudioRecord是否正确初始化? (我的代码中没有出现exception。) _audioRecord.getState() == AudioRecord.STATE_UNINITIALIZED 也是错误的。 或者我如何检查SpeechRecognizer是否正确地释放麦克风? 非常感谢!