Android上基于OmRecorder實現(xiàn)錄音暫停播放功能

最近由于項目中的需求,需要實現(xiàn)一個可以暫停錄音并播放已錄制部分的功能,以此文記錄一下實現(xiàn)的過程,希望能給大家提供一些幫助

OmRecorder介紹

OmRecorder是一個開源的,用于實現(xiàn)音頻錄制的第三方庫,支持Pcm,Wav格式的音頻錄制,并支持暫停與續(xù)錄的功能。對于OmRecorder的更多介紹與使用說明可以看它的Github主頁,本文就不贅述了。但是OmRecorder只能在音頻錄制全部完成后才可以播放音頻,所以下面主要介紹的就是在其的基礎上實現(xiàn)在暫停錄制的情況下實現(xiàn)需求。

實現(xiàn)思路

首先我們來看看OmRecorder中Wav格式下結束錄制時的流程:

  //omrecorder.Wav
  @Override public void stopRecording() {
    try {
      super.stopRecording();
      //寫入Wav文件的Header
      writeWavHeader();
    } catch (IOException e) {
      throw new RuntimeException("Error in applying wav header", e);
    }
  }

  private void writeWavHeader() throws IOException {
    final RandomAccessFile wavFile = randomAccessFile(file);
    wavFile.seek(0); // to the beginning
    wavFile.write(new WavHeader(pullTransport.pullableSource(), file.length()).toBytes());
    wavFile.close();
  }

再看看它的父類中的stopRecording方法又干了些什么:

  //omrecorder.AbstractRecorder
  @Override public void stopRecording() throws IOException {
    pullTransport.stop();
    outputStream.flush();
    outputStream.close();
  }

根據(jù)上面的代碼可以看出,OmRecorder中Wav完成錄制的操作就是將錄制的流全部寫入文件后再為文件加上一個Header,一個可播放的Wav文件就生成出來了。既然如此,那么在暫停播放時仿照這個流程,將錄制的音頻文件復制一份出來,再為其加上Header,不就是一個可以播放的文件了嗎。

具體實現(xiàn)

仿制Wav類創(chuàng)建一個新的Recorder類,繼承AbstractRecorder,并修改其中的pauseRecording方法:

class CustomRecorder(pullTransport: PullTransport, var recordFile: File, val tempFile: File) : AbstractRecorder(pullTransport, recordFile) {
    override fun pauseRecording() {
        super.pauseRecording()
        try {
            if (tempFile.exists()) { tempFile.delete() }
            FileUtil.copyFile(recordFile.path, tempFile.path)
            writeWavHeader(tempFile)
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    override fun stopRecording() {
        try {
            super.stopRecording()
            writeWavHeader(recordFile)
        } catch (e: IOException) {
            throw RuntimeException("Error in applying wav header", e)
        }
    }

    @Throws(IOException::class)
    private fun writeWavHeader(targetFile: File) {
        val wavFile = randomAccessFile(targetFile)
        wavFile.seek(0) // to the beginning
        wavFile.write(WavHeader(pullTransport.pullableSource(), targetFile.length()).toBytes())
        wavFile.close()
    }

    private fun randomAccessFile(file: File): RandomAccessFile {
        val randomAccessFile: RandomAccessFile
        try {
            randomAccessFile = RandomAccessFile(file, "rw")
        } catch (e: FileNotFoundException) {
            throw RuntimeException(e)
        }
        return randomAccessFile
    }
}

以上是我使用kotlin實現(xiàn)的自定義Record類的具體代碼,其中的構造函數(shù)中添加了一個tempFile參數(shù),這就是暫停播放時保存的已錄制部分可播放的Wav文件,需要注意的是上面代碼中使用的WavHeader類的訪問權限在OmRecorder中是default的,不能夠直接使用,所以需要完整拷貝一份來用。

至此,自定義的Recorder就已經(jīng)完成了,之后只需要使用這個類來進行音頻錄制即可,由于是仿照OmRecorder中的Wav來實現(xiàn)的,所以除了構造函數(shù)中多出一個參數(shù)外其它部分與文檔中的Wav使用方法完全一致。

最后附上項目的Github地址:https://github.com/aa352160/AudioRecordDialog

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容