iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android音视频开发(五)AudioRecord录制音频
  • 130
分享到

Android音视频开发(五)AudioRecord录制音频

Android 2022-06-06 13:06:42 130人浏览 独家记忆
摘要

简介 AudioRecord是安卓多媒体框架中用于录制音频的工具。它支持录制原始音频数据,即PCM数据,PCM数据不能被播放器直接播放,需要编码

简介

AudioRecord是安卓多媒体框架中用于录制音频的工具。它支持录制原始音频数据,即PCM数据,PCM数据不能被播放器直接播放,需要编码压缩成常见音频格式才能被播放器识别。而原生api也提供了AudioTrack播放PCM数据。
谷歌Api文档

录音流程

AudioRecord是通过read方式不断读取来自音源输入的数据流(字节流),进而把数据流保存成PCM数据。
开始录音的时候,AudioRecord需要创建一个缓冲区, 这个缓冲区主要是用来保存新的音频数据,它用于标识一个AudioRecord对象还没有被读取(同步)声音数据前能录多长的音(即一次可以录制的声音容量)。声音数据不断从音频硬件中被读出,每次读取的数据大小不超过初始化缓冲区的容量(录音数据的大小)。
流程如下:

构造一个AudioRecord对象。其中最小录音数据缓存的缓冲区大小可以通过getMinBufferSize方法得到,如果缓冲区容量过小,将导致对象构造的失败。 初始化一个缓冲区,该缓冲区大小大于等于AudioRecord对象用于写声音数据的缓冲区大小,用于缓存读取的音频数据。 startRecording开始录音 创建一个数据流,不断地从AudioRecord中读取声音数据到初始化的缓冲区,然后将缓冲区中的数据输出。 关闭数据流 停止录音 示例

下面使用Kotlin代码展示AudioRecord如何录制音频数据:

class AudioActivity : AppCompatActivity() {
    //音频录制
    private var audioRecord: AudioRecord? = null
    //缓冲区大小,缓冲区用于保存音频数据流
    private var bufferSize: Int = 0
    //记录是否正在录制音频
    @Volatile private var isRecording = false
	//录音线程
    private var recordThread: Thread? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_media)
        initRecoder()
    }
    
    private fun initRecoder() {
        
        bufferSize = AudioRecord.getMinBufferSize(
            44100,
            AudioFORMat.CHANNEL_IN_MONO,
            AudioFormat.ENcoding_PCM_16BIT
        )
        
        audioRecord = AudioRecord(
            MediaRecorder.AudiOSource.MIC,
            44100,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            bufferSize * 2
        )
    }
    
    fun startRecord(view: View) {
        if (isRecording) {
            return
        }
        isRecording = true
        if (recordThread == null) {
            recordThread = Thread(recordRunnable)
        }
        recordThread!!.start()
    }
    
    fun stopRecord(view: View) {
    	//置为false,表示线程循环就结束了,线程也执行完毕了
    	//也可以直接中断线程
        isRecording = false
        audioRecord?.stop()
        audioRecord?.release()
        audioRecord = null
        recordThread = null
    }
    
    private val recordRunnable = Runnable {
        //设置线程优先级
        Android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO)
        //创建文件
        val tmpFile: File? = FileUtil.createFile("${System.currentTimeMillis()}.pcm")
        //文件输出流
        var fos: FileOutputStream = FileOutputStream(tmpFile?.getAbsoluteFile())
        try {
            if (audioRecord?.getState() !== AudioRecord.STATE_INITIALIZED) {
                //没有初始化成功
                return@Runnable
            }
            //开始录制
            audioRecord?.startRecording()
            var buffer = 0
            val bytes = ByteArray(bufferSize)
            //轮询读取数据
            while (isRecording) {
                if (audioRecord != null) {
                    buffer = audioRecord!!.read(bytes, 0, bufferSize)
                    if (buffer == AudioRecord.ERROR_INVALID_OPERATION || buffer == AudioRecord.ERROR_BAD_VALUE) {
                        continue
                    }
                    if (buffer == 0 || buffer == -1) {
                        break
                    }
                    //在此可以对录制音频的数据进行二次处理 如变声,压缩,降噪等操作
                    //也可以直接发送至服务器(实时语音传输) 对方可采用AudioTrack进行播放
                    //这里直接将pcm音频数据写入文件
                    fos.write(buffer)
                }
            }
        } catch (e: Exception) {
            Log.e("Test", "出错了", e)
        } finally {
            try {
                fos?.close()
            } catch (ex: IOException) {
            }
        }
    }
}

作者:GdinKing


--结束END--

本文标题: Android音视频开发(五)AudioRecord录制音频

本文链接: https://www.lsjlt.com/news/29262.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作