使用mediaRecorder.setOutputFile的注意事项

一、使用mediaRecorder.setOutputFile之前应该先创建好本地路径,否则会报java.lang.IllegalStateException: failed to get surface

正确做法是:

private var tempFile: String? = null

private fun startRecording() {
        // 1、先创建好本地文件
        val file = File(fileName)
        if (!file.exists()) {
            file.mkdirs()
        }
        tempFile = File(file, "${System.currentTimeMillis()}.mp3").absolutePath
        
        mediaRecorder = MediaRecorder()
        mediaRecorder?.apply {
            setAudioSource(MediaRecorder.AudioSource.MIC)
            setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
            // 2、再设置setOutputFile
            setOutputFile(tempFile)
            setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
二、使用mediaRecorder.setOutputFile的IOException异常

发生这种情况主要有:

1、文件路径无效或不可写,应该确保是否已获取写入权限以及目录是否存在;

2、调用setOutputFile()时状态不正确。如果在录制过程中或者在调用prepare()之前调用setOutputFile(),也可能会抛出IOException异常。这是因为setOutputFile()必须在prepare()被调用之前设置好输出文件

正确做法:

    private fun startRecording() {
        val file = File(fileName)
        if (!file.exists()) {
            file.mkdirs()
        }
        tempFile = File(file, "${System.currentTimeMillis()}.mp3").absolutePath

        mediaRecorder = MediaRecorder()
        mediaRecorder?.apply {
            setAudioSource(MediaRecorder.AudioSource.MIC)
            setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
            setOutputFile(tempFile)
            setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)

            // setOutputFile()在prepare()之前被调用,并设置好输出文件
            try {
                prepare()
                start()
                isRecording = true
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值