在下面的代码中,我的audioRecord对象没有初始化.我尝试将其移动到该onCreate方法并使其成为全局的.我已记录状态,并返回一个值1,表示可以使用.调试器表示startRecording正在未初始化的对象上调用它.它还说它无法获得音频源.
为什么我会收到这些错误?
package com.tecmark;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class recorder extends Activity {
private Thread thread;
private boolean isRecording;
private AudioRecord recorder;
private FileOutputStream os;
private BufferedOutputStream bos;
private DataOutputStream dos;
private TextView text;
private int audioSource = MediaRecorder.AudioSource.MIC;
private int sampleRate = 22050;
private int channel = AudioFormat.CHANNEL_CONFIGURATION_MONO; …Run Code Online (Sandbox Code Playgroud) 我正在设计一个Android应用程序,我需要实现一个AudioRecord类来记录用户的声音.经过一些研究(没有提供足够的信息)和几次失败的尝试,我想知道是否有人可以通过发布关于如何使用AudioRecord捕获高质量声音的示例(代码)来帮助我.我真的很感激.谢谢
我正在研究通过公对公音频插孔电缆传输文本数据.
我正在HTC one V和PC上进行测试,它支持用于数据传输的公对公音频插孔,如本维基百科文章所述.它说:
第一个将返回信号放在第二个环上,麦克风放在套管上,用于Apple的iPhone系列,HTC设备,最新的三星,诺基亚和索尼手机等.
你可以在这里看到我的代码.
转移过程中遇到的问题:如果我通过输入发送方0-31之间的任何值生成音调,由于错误的FSK调制/解调类型,接收器将在2-3次尝试中获得实际值.你会建议最好的纠错码,它可以帮助我纠正从另一个Android设备收到的输入吗?
如果有人之前已经完成过这种类型的数据传输,请提供代码参考或有关技术方面的一些基本指导,因此我可以完成此操作并使其成为每个人的开源.
android android-mediarecorder android-audiomanager android-audiorecord
我正在试图弄清楚运行Android 2.2及更高版本的手机支持哪些采样率.我们想以低于44.1kHz的速率进行采样,而不必重新采样.
我知道所有手机都支持44100Hz,但是想知道是否有一张桌子显示哪些采样率对特定手机有效.我已经看过Android的文档(
http://developer.android.com/reference/android/media/AudioRecord.html),但它没有多大帮助.
有没有人找到这些采样率的清单?
我试图使用AudioRecord与AudioSource.VOICE_DOWNLINK在Nexus 5X的Android 7.1(我自己的构建从AOSP).
我已经超过了权限阶段 - 将我的APK移动到特权应用程序,AudioRecord在Android源代码中进行了调整以停止抛出有关此源的异常.
现在我在通话期间得到空录音缓冲区.
我知道有很多通话录音应用程序,它们可以在其他设备上运行.我也看到某些应用程序可以对已植根的N5执行某些操作并使其正常工作.
我希望在Nexus 5X上实现同样的目标 - 任何调整对我来说都可以,包括更改Android版本,修改Qualcomm驱动程序,设备配置文件等等 - 基本上可以在自定义ROM中实现.
我已经尝试过使用平台代码 - 硬件/ qcom/audio/hal/voice.c,特别是功能voice_check_and_set_incall_rec_usecase,但到目前为止还没有意义.
还检查了device/lge/bullhead/mixer_paths.xml,发现有一个与呼叫记录相关的部分:
<!-- Incall Recording -->
<ctl name="MultiMedia1 Mixer VOC_REC_UL" value="0" />
<ctl name="MultiMedia1 Mixer VOC_REC_DL" value="0" />
<ctl name="MultiMedia8 Mixer VOC_REC_UL" value="0" />
<ctl name="MultiMedia8 Mixer VOC_REC_DL" value="0" />
<!-- Incall Recording End -->
Run Code Online (Sandbox Code Playgroud)
但我也无法理解它或它是如何得到帮助的.
android alsa android-mediarecorder android-audiorecord android-rom
我正在尝试实现自动录音功能,类似于Talking Tom应用程序.我使用以下代码从录音机读取输入并分析缓冲区:
float totalAbsValue = 0.0f;
short sample = 0;
numberOfReadBytes = audioRecorder.read( audioBuffer, 0, bufferSizeInBytes);
// Analyze Sound.
for( int i=0; i<bufferSizeInBytes; i+=2 )
{
sample = (short)( (audioBuffer[i]) | audioBuffer[i + 1] << 8 );
totalAbsValue += Math.abs( sample ) / (numberOfReadBytes/2);
}
// Analyze temp buffer.
tempFloatBuffer[tempIndex%3] = totalAbsValue;
float temp = 0.0f;
for( int i=0; i<3; ++i )
temp += tempFloatBuffer[i];
Run Code Online (Sandbox Code Playgroud)
现在我能够检测来自录音机的语音输入,我可以分析音频缓冲区.
缓冲区被转换为浮点值,如果它增加一定量,则假设背景中有一些声音并开始录制.但问题是该应用程序开始记录所有背景噪音,包括风扇/交流管声音.
任何人都可以帮我分析缓冲区来检测人声吗?或者还有其他方法可以从录音机输入中检测人声吗?
提前致谢,
我的Android Java应用程序需要将音频数据记录到RAM中并进行处理.这就是我使用"AudioRecord"类而不是"MediaRecorder"(仅记录到文件)的原因.
直到现在,我使用繁忙的循环轮询"read()"来表示音频数据.到目前为止,这一直在起作用,但它过多地占用了CPU.在两次民意调查之间,我将线程置于休眠状态以避免100%的CPU使用率.但是,这并不是一个干净的解决方案,因为无法保证睡眠时间,您必须减去安全时间,以免丢失音频片段.这不是CPU的最佳选择.对于并行运行的线程,我需要尽可能多的空闲CPU周期.
现在我使用"OnRecordPositionUpdateListener"实现了录制.根据SDK Docs,这看起来很有前途,也是正确的方法.一切似乎都有效(打开音频设备,读取()数据等)但从不调用Listner.
有人知道为什么吗?
信息:我正在使用真实的设备,而不是在仿真器下.使用Busy Loop录制基本上可以工作(但不是满意).永远不会调用Callback Listener.
这是我的源代码片段:
public class myApplication extends Activity {
/* audio recording */
private static final int AUDIO_SAMPLE_FREQ = 16000;
private static final int AUDIO_BUFFER_BYTESIZE = AUDIO_SAMPLE_FREQ * 2 * 3; // = 3000ms
private static final int AUDIO_BUFFER_SAMPLEREAD_SIZE = AUDIO_SAMPLE_FREQ / 10 * 2; // = 200ms
private short[] mAudioBuffer = null; // audio buffer
private int mSamplesRead; // how many samples are recently read
private AudioRecord mAudioRecorder; // Audio Recorder
... …Run Code Online (Sandbox Code Playgroud) 我在初始化AudioRecordAndroid时遇到了这个问题.我在网上搜索了一段时间没有成功.
对于手机,我在SDK版本7上使用三星GalaxyS.对于AudioRecord初始化,我使用8000作为采样率,MONO用于通道配置,16位用于音频格式,并根据日志,minBufferSize设置是4160.我已将清单的AUDIO_RECORD权限添加到了清单中.
我的初始化代码如下:
...
private static int SAMPLE_RATE = 8000;
private static int CHANNEL_CONFIG = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private static int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
// ??? Both 8Bit and Default are deemed illegal.
public MicVolumeManager() {
this.bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
CHANNEL_CONFIG, AUDIO_FORMAT);
PhoneDebugger.debug("AUDIO-BUFFER-SIZE",
Integer.toString(this.bufferSize));
this.recorder = new AudioRecord(AudioSource.MIC, SAMPLE_RATE,
CHANNEL_CONFIG, AUDIO_FORMAT, this.bufferSize);
this.audioBuffer = new byte[this.bufferSize];
}
...
Run Code Online (Sandbox Code Playgroud)
但是,对象(this.recorder)无法初始化.以下是使用DDMS的日志:
AUDIO-BUFFER-SIZE(3253): 4160
AudioRecord(3253): set():sampleRate 8000,channels 16,frameCount 2080
AudioPolicyManager(2175): getInput()inputSource 1,samplingRate 8000,format 1,channels 10,acoustics 0
AudioFlinger (2175): openInput()openInputStream返回输入0x0,SamplingRate 8000,格式1,通道10,声学0,状态-17
AudioRecord(3253):无法获取记录源1的音频输入 …
我的问题很容易解释 - 我试图创建一个AudioRecord对象,但它无法初始化(即在构造函数之后,getState返回0,表示失败).我在运行OS 2.2.1的MotoDroid 1上从Eclipse运行它.我的AndroidManifest.xml是AFAIK,使用了正确的权限,RECORD_AUDIO(我不知道如何确认):
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<activity android:name=".SphinxMic"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Run Code Online (Sandbox Code Playgroud)
我执行以下操作来创建AudioRecord:
bufferSize = AudioRecord.getMinBufferSize(8000, CHANNEL_IN_MONO, ENCODING_PCM_8BIT);
audioRecorder = new AudioRecord(AudioSource.MIC, 8000, CHANNEL_IN_MONO, ENCODING_PCM_8BIT, 50*bufferSize);
if (audioRecorder.getState() != AudioRecord.STATE_INITIALIZED)
throw new Exception("AudioRecord init failed");
Run Code Online (Sandbox Code Playgroud)
audioRecorder.getState()返回0(即STATE_UNINITIALIZED)
我还没有找到任何使用这个API的完整示例,我非常喜欢Android初学者,所以解决方案可能很简单.我该怎么做才能找出失败的原因?
有些人提出了类似的问题,但他们肯定遇到了与我不同的问题,因为他们批准的修复措施对我没有帮助.最值得注意的是这个.但批准的解决方案令人困惑,无论如何都不适用于我.我还尝试了各种比特率(8000,16000,11025,44100),单声道和立体声以及8和16比特.成功初始化后没有组合回来.
Hej,我目前正试图让AudioRecord工作.因为我需要一个更大的项目.但它似乎搞得很多.我一直在尝试很多东西,所以当我追踪这个bug时我回到了基础.我正在使用我的三星Galaxy S作为我的调试设备.
我的问题是,第一次重启我的设备后,我可以初始化我创建的AudioRecord对象没有问题.但是第二次运行它时,它不会初始化AudioRecord对象.我已经尝试了几个频率,fyi.
这是我的代码:
package android.audiorecordtest;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class AudioRecordTest extends Activity {
int frequency;
AudioRecord audRec;
TextView txtVw;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtVw = (TextView) findViewById(R.id.txtVw);
frequency=8000;
int bufferSize=(AudioRecord.getMinBufferSize(frequency, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT))*2;
if (bufferSize>0) {
audRec = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
int status = audRec.getState();
if (status == …Run Code Online (Sandbox Code Playgroud) android ×10
audio ×4
alsa ×2
audiorecord ×2
android-rom ×1
callback ×1
microphone ×1
recording ×1
sample-rate ×1