android - 在 Android 上使用 AudioRecord 录制可以加快音频速度?

标签 android audiorecord

我正在使用 AudioRecord 录制原始音频以供处理。 音频记录完全没有任何噪音,但是当播放生成的原始 PCM 数据时,它播放起来好像已经加速了很多(大约两倍)。 我正在 Audacity 中查看和播放 PCM 数据。我正在使用实际手机 (Samsung Galaxy S5670) 进行测试。 录音以 44100 Hz,16 位完成。知道是什么原因造成的吗?

以下为录制代码:

public class TestApp extends Activity
{   
File file;
OutputStream os;
BufferedOutputStream bos;       
AudioRecord recorder;   
int iAudioBufferSize;
boolean bRecording; 
int iBytesRead;

Thread recordThread = new Thread(){
    @Override
    public void run()
    {
        byte[] buffer = new byte[iAudioBufferSize];
        int iBufferReadResult;
        iBytesRead = 0;
        while(!interrupted())
        {
            iBufferReadResult = recorder.read(buffer, 0, iAudioBufferSize);
            // Android is reading less number of bytes than requested.
            if(iAudioBufferSize > iBufferReadResult)
            {
                iBufferReadResult = iBufferReadResult + 
                        recorder.read(buffer, iBufferReadResult - 1, iAudioBufferSize - iBufferReadResult);
            }               
            iBytesRead = iBytesRead + iBufferReadResult;
            for (int i = 0; i < iBufferReadResult; i++)
            {
                try
                {
                    bos.write(buffer[i]);
                } catch (IOException e)
                {                                               
                    e.printStackTrace();
                }
            }
        }
    }
};  

@Override
public void onCreate(Bundle savedInstanceState)
{
    // File Creation and UI init stuff etc.

    bRecording = false;
    bPlaying = false;

    int iSampleRate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
    iAudioBufferSize = AudioRecord.getMinBufferSize(iSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); 
    recorder = new AudioRecord(AudioSource.MIC, iSampleRate, AudioFormat.CHANNEL_IN_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, iAudioBufferSize);

    bt_Record.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if (!bRecording)
            {
                try
                {                       
                    recorder.startRecording();
                    bRecording = true;
                    recordThread.start();                       
                }
                catch(Exception e)
                {
                    tv_Error.setText(e.getLocalizedMessage());
                }
            }
            else
            {
                recorder.stop();
                bRecording = false;
                recordThread.interrupt();
                try
                {
                    bos.close();
                }
                catch(IOException e)
                {

                }
                tv_Hello.setText("Recorded Sucessfully. Total " + iBytesRead + " bytes.");
            }
        }

    });
}
}

已解决:我在苦苦思索了 1-2 天后发布了这篇文章。但是,具有讽刺意味的是,我在发布后很快就找到了解决方案。缓冲输出流写入在 for 循环中花费了太多时间,因此流正在跳过样本。将其更改为阻止写入,删除 for 循环。完美运行。

最佳答案

音频跳过是由于写入缓冲区的延迟造成的。 解决方案是替换这个 FOR 循环:

        for (int i = 0; i < iBufferReadResult; i++)
        {
            try
            {
                bos.write(buffer[i]);
            } catch (IOException e)
            {                                               
                e.printStackTrace();
            }
        }

通过一次写入,像这样:

       bos.write(buffer, 0, iBufferReadResult);

我曾使用过一本书中的代码,我猜它可以用于较低的采样率和缓冲区更新。

关于android - 在 Android 上使用 AudioRecord 录制可以加快音频速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11151414/

相关文章:

android - 如何理解 dalvik 字节码中的@VIL

android - 分割CHANNEL_IN_STEREO的AudioRecord的两个 channel

android - 通话录音在棉花糖及更高版本中不起作用

java - Android Manifest 又该如何合并?

java - 更改时间选择器的主题 - Android

java - 如何解析地点详细信息 API JSON

android - 如何从手机通讯录中查找注册用户

android - 需要一个简单的录音例子

android - AudioFlinger 无法创建记录轨道,状态 : -1 , 需要 ifx 帮助

android - 使用NDK进行Android录音通话