我是Android开发的新手,我有下一个问题/问题.
我正在玩MediaRecorder类来录制麦克风中的音频.我正在按照官方网站上指示的步骤操作:http://developer.android.com/reference/android/media/MediaRecorder.html
所以我有一个初始化和配置MediaRecorder对象的方法,以便开始录制.在这里你有代码:
//initializes audio recorder
MediaRecorder mrecorder = new MediaRecorder();
//configure the input sources
mrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//set the output format
mrecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//set the audio encoding
mrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//specify the output file
mrecorder.setOutputFile("/sdcard/test.3gp");
//prepare for recording
try {
mrecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
Log.d("Syso". e.toString());
} catch (IOException e) {
e.printStackTrace();
Log.d("Syso". e.toString());
}
Run Code Online (Sandbox Code Playgroud)
当我在模拟器中执行此代码时,感谢logcat,我可以看到方法prepare()在调用时给出异常:
java.io.FileNotFoundException: /sdcard/test.3gp (Permission denied)
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会这样.由于异常消息,我通过在xml中添加以下行来在清单中授予访问存储的权限:
<uses-permission android:name="android.permission.STORAGE" />
Run Code Online (Sandbox Code Playgroud)
但这并没有解决任何问题,我仍然会一直得到同样的例外.SDCard是根据模拟器安装的,所以我不知道.
android exception audio-recording permission-denied mediarecorder
我正在开发一个应用程序,需要对从麦克风捕获的原始PCM音频执行识别算法.在我测试过的所有Android设备上,PCM数据都是可用的(即原始音频数据).对于新的Sprint EVO,情况并非如此.
Sprint EVO在麦克风上有AGC(自动增益控制),它会破坏数据,使我们的识别算法不再有效.
我相信这是HTC为此设备(以及可能未来的设备)添加到操作系统中的一项功能.我已经在使用相同操作系统版本(2.1)的其他几个设备上测试了我们的应用程序,而这些其他设备的行为正常.
很遗憾,HTC尚未发布此设备上使用的代码.我希望我可能不得不使用JNI来绕过这个特定的设备,我愿意这样做,但是如果没有访问HTC源,我就不知道从哪里开始.
没有办法扭转AGC的影响,所以我一直试图解决它.
更具体的信息:
我正在使用AudioRecorder来访问原始PCM数据.我尝试了一些使用MediaRecorder记录AMR数据的程序,这些记录也表现出相同的AGC属性.
我还有一件事要做,就是编写自己的例程来使用MediaRecorder并使用setAudioSource(AudioSource.VOICE_RECOGNITION).我在这个标志上可以找到的唯一文档来自Android参考,它简单地说明"如果可用的话,调整用于语音识别的麦克风音频源,其行为就像DEFAULT".这可能是我需要的,但是需要额外的步骤来解码AMR数据以获得PCM数据(如果必须的话,我会这样做.)
如果有人知道这个新的"功能",任何信息将不胜感激.具体来说,如果我得到以下任何问题的答案,我的生活会好得多:
任何其他线索,提示,提示将不胜感激.
我需要一次录制多个音频。我有两个录制按钮,如果我点击第一个录制按钮,录音将开始。在停止录音之前如果我单击第二个录制按钮,我需要单独录制另一个音频。是否可以一次录制多个音频?
提前致谢..!
我正在尝试开发录制音频和播放的应用程序.我能够录制和播放录制的文件.现在我想在录制音频或声音时显示录制时间.搜索谷歌和许多事情无法得到任何想法.任何人都可以说我如何进行下一步.
这是我用计时器录音的代码
public class AudioRecordActivity extends Activity implements OnClickListener {
MediaRecorder recorder = new MediaRecorder();
private String fileName;
private Button record;
private Button play;
private Button stop;
private TextView timeDisplay;
Chronometer myChronometer;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
record = (Button) findViewById(R.id.recordButton);
record.setOnClickListener(this);
play = (Button) findViewById(R.id.playButton);
play.setOnClickListener(this);
stop = (Button) findViewById(R.id.stopButton);
stop.setOnClickListener(this);
myChronometer = (Chronometer) findViewById(R.id.timer);
record.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated …Run Code Online (Sandbox Code Playgroud) 我正在开发一个记录音频的安卓应用程序。为了获得最佳音频质量,最好short在阅读时使用s缓冲区?
//aRecorder.read(shortBuffer, 0, shortBuffer.length);
aRecorder.read(byteBuffer, 0, byteBuffer.length);
Run Code Online (Sandbox Code Playgroud)
使用short[]与使用byte[]和考虑来自 2bytes(byteBuf[i]和byteBuf[i+1])的样本不同?如果我使用short[],无论如何我都必须将其转换为将其ByteBuffer写入文件。
我问这个是因为我想知道如果我切换到shorts 的缓冲区,我的录音会更准确吗?例如,shortBuffer[0]包含了相同的信息byteBuffer[0]和byteBuffer[1]?
录音可以是 16 位 PCM 或 8 位 PCM(用户可以选择采样率、通道数、PCM 16 或 8 等)
我必须提到输出文件将采用 WAV 格式。
audio android audio-recording audiorecord android-audiorecord
我们正在开发一个跨平台项目,需要在智能手机上进行音量采样并尽可能准确地分析结果,IPhone 开发人员使用 iOS 实现的功能,返回由操作系统本身计算的以 dB 为单位的声功率/音量。据我所知,Android 操作系统中没有等效的功能。
到目前为止,我正在使用操作系统提供的 MediaRecorder 类在 Android 上工作,并且我使用 getMaxAmplitude 来测量声功率/音量,我在网上看到了很多关于如何将幅度转换为 dB 标度的答案,听起来最合理的答案是使用以下公式:
20*Math.log10(幅度/MAX_AMPLITUDE)
但是我必须知道 getMaxAmplitude 可以返回的 MAX_AMPLITUDE 是什么,问题是它在不同设备上是不同的,例如我在 HTC Desire 和三星 Galaxy S3 上测试了 getMaxAmplitude,在 HTC 上它达到了 32767(我看到在某些答案中记录的最大值),并且在 S3 上它没有超过 16383(HTC 的一半)。
第一季度:
这是(上面讨论的方法)正确的方法吗?只是我读到测量声功率/音量的正确方法是通过计算 RSM 然后将其转换为 dB,这是在 iPhone 上是如何完成的吗?
问题二:
如果我使用 RSM 或仅使用 getMaxAmplitude 中的 Amplitude,我觉得我仍然需要知道我可以从记录硬件中获得的最高幅度是多少,有没有办法知道这一点?或者有没有办法以某种方式绕过它?
我正在使用Cordova的Media API为iOS 5.0+制作一个简单的录音机.我正在为用户提供启动 - 暂停 - 恢复 - 停止录制音频的能力.
我定义的三个按钮是
开始录制
停止录制
暂停/恢复录制
我能够成功开始和停止录音.我无法做的是暂停录制然后再次恢复.
我提到了Cordova 的Media API示例,并且在我的代码中使用了一些.
请帮助!!!
我试图了解使用Audiorecord.read()获得的值实际意味着什么.
我正在尝试创建一个应用程序,它将在检测到脉冲响应时开始录制声音(因此我必须设置一个阈值,其中任何声音将被视为冲动).
问题是当我调用这个方法时,我真的不知道"data"中存储的值是什么意思:
read = recorder.read(data, 0, bufferSize);
Run Code Online (Sandbox Code Playgroud)
这些是我获得的一些价值观:
[96,2,101,3,101,2,110,1,-41,2,-80,2,-117,2,119,2,-94,0 .........]
我们的想法是从这些值设置阈值,但首先我需要知道它们代表什么.
你能帮助我吗?
我有一个可以在Android 5.0版本上正常运行的android代码。我的AndroidManifest.xml是
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
Run Code Online (Sandbox Code Playgroud)
但是,我的使用Android 6.0(LG G5)的客户报告该应用程序无法正常运行。我没有LG G5来检查问题所在。我认为原因是权限从5.0更改为6.0。您能否看一下我的许可,并请我为Android 6.0进行一些改进/更正?还是我们有任何方法可以自动为Android 6.0添加权限。谢谢大家
android audio-recording android-permissions android-6.0-marshmallow
我正在尝试将一些音频流从我的浏览器发送到某个服务器(udp,也尝试使用 websockets)。我正在使用 webrtc 录制音频流,但是在将数据从 nodeJS 客户端传输到我的服务器时遇到问题。任何的想法?是否可以使用 webrtc(openwebrtc) 将音频流发送到服务器?
audio-recording audio-streaming live-streaming webrtc openwebrtc
audio-recording ×10
android ×8
audiorecord ×2
audio ×1
cordova ×1
cordova-3 ×1
exception ×1
ios ×1
iphone ×1
openwebrtc ×1
timer ×1
webrtc ×1