Разделите звукозапись на более мелкие куски отдельных файлов Android - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь реализовать сплиттер аудиозаписи.Мое требование заключается в том, что если продолжительность звука превышает 30 секунд, звук должен разделяться на несколько аудиофайлов по 30 секунд.

Для этого я запускаю таймер при запуске рекордера и каждые 30 секунд прекращаю его запись, сохраняю файл и перезагружаю рекордер.Это работает нормально, и аудио файлы сохраняются на устройстве.Но когда я пытаюсь открыть их, проигрывается только последний аудиофайл, все файлы кажутся поврежденными.

Ниже приведен мой код: -

/**
     * Allow the app to record the audio after the user has granted permission.
     *
     * @param mContext
     */
    public static void allowRecording(final Activity mContext)
    {
        isRecording = true;
        mStartRecording = true;

        if (!mRecord)
        {
            if (timer != null)
            {
                timer.cancel();
                stopRecording();
                mRecord = true;
            }
        }

        mRecord = false;
        // start record,at every 30 seconds
        timer = new Timer();
        timer.schedule(new TimerTask()
        {
            @Override
            public void run()
            {
                i++;
                mContext.runOnUiThread(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        onRecord(mStartRecording, i, mContext);
                        mStartRecording = !mStartRecording; // setting false
                    }
                });

            }
        }, 0, 30000);
    }

    /**
     * Check if the stop button has been pressed.
     * If not stop recording audio automatically after an interval eg .10 secs and start the recording again.
     *
     * @param start
     * @param i
     * @param mContext
     */
    private static void onRecord(boolean start, int i, Activity mContext)
    {
        if (isRecording)
        {
            if (start)
            {
                startRecording(outputFileDirectory + mContext.getString(R.string.str_audio) + i + mContext.getString(R.string.str_file_type_mp4));
            }
            else
            {
                stopRecording();// stop recording
                startRecording(outputFileDirectory + mContext.getString(R.string.str_audio) + i + mContext.getString(R.string.str_file_type_mp4));//imeadiatly start recording
            }
        }
        else
        {
            timer.cancel();
        }
    }

    /**
     * Start recording audio
     */
    public static void startRecording(String mFileName)
    {
        if (mediaPlayer != null && mAudioRecorder != null)
        {
            mediaPlayer.stop();
            mAudioRecorder.release();
            mediaPlayer = null;
            mAudioRecorder = null;
        }
        mAudioRecorder = new MediaRecorder();
        mAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        mAudioRecorder.setOutputFile(mFileName);
        clippingList.add(mFileName);

        try
        {
            mAudioRecorder.prepare();
            mAudioRecorder.start();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * Automatic method to stop recording only to continue the recording again after an interval
     */
    private static void stopRecording()
    {
        if (mAudioRecorder != null)
        {
            mAudioRecorder.stop();
            mAudioRecorder.release();
            mAudioRecorder = null;
        }
    }

    public static List<String> stopRecording completely()
    {
       if (mAudioRecorder != null)
        {
            mAudioRecorder.stop();
            mAudioRecorder.release();
            mAudioRecorder = null;
            timer.cancel();
        }
        isRecording = false;
        isAudioPlaying = false;
        return clippingList;
    }

Любая помощь по этому вопросу приветствуется.

...