记录音频的任何想法都会让我的整个应用程序变慢?

时间:2016-09-01 04:05:05

标签: java android audio

所以我有一个应用程序,我从麦克风中读取并将其记录到文件中(在补丁中)。

即使我认为我在一个单独的线程中有OnRecordPositionUpdateListener和所有记录的相关项目,我的主线程UI线程也会变得非常慢。因此,在录制时,我点击屏幕上的按钮会严重延迟。

使用注释掉编码的过程,我将其缩小到我从缓冲区中提取数据的部分。

int samplesRead = recorder.read(audioBuffer, 0, mAudioBufferSampleSize);

不是将数据写入本地内存或其他任何内容(我在尝试找到问题时已将其注释掉)。

有没有人在这里有任何经验,我能做些什么以某种方式减轻阻力?

这是我开始的线程,并在用户点击“开始”按钮后写入录音。

  public View.OnClickListener startListener = new View.OnClickListener()
    {
        int x = 0;

        public void onClick(View v)
        {
            buttonStart.setEnabled(false);
            buttonStop.setEnabled(true);
            inRecordMode = CURRENT_REC;

            if(!bInit)
            {
                bInit = true;

                Thread tSanyo = new Thread(new Runnable()
                {

                    @Override
                    public void run()
                    {

                        final String sPath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/tapes";

                        try
                        {
                            int sampleRate = 44100;
                            int channelConfig = AudioFormat.CHANNEL_IN_MONO;
                            int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
                            mAudioBufferSize = AudioRecord.getMinBufferSize(sampleRate,
                                    channelConfig, audioFormat);
                            mAudioBufferSampleSize = mAudioBufferSize * 10;
                            mAudioRecord = new AudioRecord(
                                    MediaRecorder.AudioSource.MIC,
                                    sampleRate,
                                    channelConfig,
                                    audioFormat,
                                    mAudioBufferSampleSize);

                        }
                        catch (IllegalArgumentException e)
                        {
                            e.printStackTrace();
                        }

                        mAudioRecord.setNotificationMarkerPosition(mAudioBufferSampleSize/2);
                        mAudioRecord.setPositionNotificationPeriod(mAudioBufferSampleSize/2);

                        OnRecordPositionUpdateListener mListener = new OnRecordPositionUpdateListener()
                        {

                            String sTemp;
                            @Override
                            public void onMarkerReached(AudioRecord recorder)
                            {
                             }

                            public void onPeriodicNotification(AudioRecord recorder)
                            {

                                short[] audioBuffer = new short[mAudioBufferSampleSize];

                                /////app slows to a crawl as soon as the first
                                /////recorder.read is called
                                int samplesRead = recorder.read(audioBuffer, 0, mAudioBufferSampleSize);

                            }
                        };
                        mAudioRecord.setRecordPositionUpdateListener(mListener);
                        int audioRecordState = mAudioRecord.getState();
                        if (audioRecordState != AudioRecord.STATE_INITIALIZED)
                        {
                            finish();
                        }
                        if(mAudioRecord == null)
                            return;
                        short[] audioBuffer = new short[mAudioBufferSampleSize];
                        mAudioRecord.startRecording();
                        int audioRecordingState = mAudioRecord.getRecordingState();
                        if(audioRecordingState != AudioRecord.RECORDSTATE_RECORDING)
                        {
                            finish();
                        }

                    }
                });
                tSanyo.start();
            }
            else
            {
            }

        }
    };

1 个答案:

答案 0 :(得分:0)

您确定它是在单独的线程上运行吗?或者是一个单独的核心,如果你正在运行一个低端的旧式学校设备,你可能会用一个核心停止CPU。

您多久阅读一次样品?如果您在一个while循环中继续读取它们,请考虑给CPU一些松弛,看看它是否有帮助。

通常,您不需要您认为的低延迟音频,但有时Android对于实时音频应用程序来说可能太慢,但不知道您的音频应用程序是什么,我会采取一些猜测。

找出导致CPU或主线程停止的原因和原因的最简单方法是使用分析器,您可以阅读here

分析器将告诉每个方法执行需要多长时间,但是,如果CPU已经停止,响应启动和停止分析器可能会很慢,但也可以通过编程方式切换。