标签: audio-recording

MediaRecorder类记录音频的问题 - prepare()给出异常 - 权限被拒绝

我是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

4
推荐指数
1
解决办法
5204
查看次数

你如何在HTC EVO(超音速)上禁用AGC?

我正在开发一个应用程序,需要对从麦克风捕获的原始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数据(如果必须的话,我会这样做.)

如果有人知道这个新的"功能",任何信息将不胜感激.具体来说,如果我得到以下任何问题的答案,我的生活会好得多:

  1. 这是HTC特有的新功能吗?
  2. HTC何时会发布EVO/Supersonic的代码库?
  3. 有没有其他人遇到这个并找到解决问题的方法?
  4. AudioSource.VOICE_RECOGNITION是否实际上阻止了AGC?
  5. AudioSource.VOICE_RECOGNITION的存在是否表明这在未来的设备中会更常见,而这个标志是绕过它的规定吗?

任何其他线索,提示,提示将不胜感激.

android audio-recording

4
推荐指数
1
解决办法
3264
查看次数

Android 一次录制多个音频?

我需要一次录制多个音频。我有两个录制按钮,如果我点击第一个录制按钮,录音将开始。在停止录音之前如果我单击第二个录制按钮,我需要单独录制另一个音频。是否可以一次录制多个音频?

提前致谢..!

android audio-recording

4
推荐指数
1
解决办法
2248
查看次数

Android:带有TImer的录音机

我正在尝试开发录制音频和播放的应用程序.我能够录制和播放录制的文件.现在我想在录制音频或声音时显示录制时间.搜索谷歌和许多事情无法得到任何想法.任何人都可以说我如何进行下一步.

这是我用计时器录音的代码

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)

android timer audio-recording

4
推荐指数
1
解决办法
7051
查看次数

Android AudioRecord - 使用短数组还是字节数组?

我正在开发一个记录音频的安卓应用程序。为了获得最佳音频质量,最好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

4
推荐指数
1
解决办法
3828
查看次数

如何以dB标度Android测量音量

我们正在开发一个跨平台项目,需要在智能手机上进行音量采样并尽可能准确地分析结果,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,我觉得我仍然需要知道我可以从记录硬件中获得的最高幅度是多少,有没有办法知道这一点?或者有没有办法以某种方式绕过它?

iphone android audio-recording mediarecorder

4
推荐指数
1
解决办法
4525
查看次数

Cordova 3.3使用Media API暂停和恢复录制

我正在使用Cordova的Media API为iOS 5.0+制作一个简单的录音机.我正在为用户提供启动 - 暂停 - 恢复 - 停止录制音频的能力.

我定义的三个按钮是

开始录制

停止录制

暂停/恢复录制

我能够成功开始和停止录音.我无法做的是暂停录制然后再次恢复.

我提到了Cordova 的Media API示例,并且在我的代码中使用了一些.

请帮助!!!

audio-recording ios phonegap-plugins cordova cordova-3

4
推荐指数
1
解决办法
1826
查看次数

值的含义来自Audiorecord.read()

我试图了解使用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 audio-recording audiorecord

4
推荐指数
1
解决办法
2678
查看次数

我们需要在Android 6.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

4
推荐指数
2
解决办法
3329
查看次数

使用 WebRTC 浏览器 =&gt; 服务器实时流式传输音频

我正在尝试将一些音频流从我的浏览器发送到某个服务器(udp,也尝试使用 websockets)。我正在使用 webrtc 录制音频流,但是在将数据从 nodeJS 客户端传输到我的服务器时遇到问题。任何的想法?是否可以使用 webrtc(openwebrtc) 将音频流发送到服务器?

audio-recording audio-streaming live-streaming webrtc openwebrtc

4
推荐指数
1
解决办法
3250
查看次数