`
384444165
  • 浏览: 258776 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AudioRecord 释放资源错误(进程意外中断)

阅读更多

释放资源 即AudioRecord.release()方法,前两天自己随手想到的一个函数,写入还真有,而且正是想要的方法--释放当前占用的资源,但是在使用中可能遇到各种各样的问题,不适用它问题就更严重了。

 

目前很多网上关于AudioRecord的讲解都没有考虑release这个方法,或者google code上面一些方法不需要release资源。但是在用的时候,尤其来电时释放mic资源是一种必须的需求,所以还是要用到release方法释放mic资源。

 

个人感觉各式各样的网络流行版本中,http://blog.csdn.net/zhjp4295216/archive/2010/11/09 /5996735.aspx这个还是比较靠谱的一个,但是它说的释放mic资源根本无法完全释放,会在电话中出现断断续续的情况。但对于使用可以作为一个参照版本,还是不错。

 

先看看api上的介绍:
public void release ()
Since: API Level 3

Releases the native AudioRecord resources. The object can no longer be used and the reference should be set to null after a call to release()

 

你一定觉得这个解释非常恼火,起码我觉得是的。根据我使用的结果应该意思是:

释放之后这个对象不能再被使用,而且引用必须变null。像废话,就是翻译嘛,但是意思不仅仅是翻译。

两种最基本的错误方式:

1。在一个线程里面处理录音,然后继承Thread的类中提供方法release,然后电话来之前先stop,然后release。

2。像那个网址里面,但是在run最后加上release。电话来时、或者后台运行时先pause,然后start

 

据这两个例子,肯定都是错的。先说问题

1。先stop或suspend再release,本质上对于audiorecord的操作还没有结束,只是要求强制关闭(stop方法本身不安全)。还是会继续占用mic,所以释放就会造成线程意外结束,系统报出线程意外中断的错误。这就是the reference should be set to null。虽然来电的情况系统会自动为你再次开启,但是总不至于每次都让用户去看到程序中断吧。

2。先pause掉之后,程序正常隐蔽,但是由于程序还会在start再次调用record,虽然是重新生成一个新的。这就是object can no longer be used and the reference should be set to null。所以在重新回到程序时会抛出相同错误。

 

这里解决方案已经很明显了,就是在实例程序的run结尾加上ar.release();。 来电结束时重新生成一个新的线程,让原来的线程结束去吧!这样就可以再来电和后台时成功释放mic了,希望解释这两个错误能让你了解那句话和系统抛出的这个纠结的错误。

 

另外,那个实例有个错误,大家想必看到了吧,还是说一下,网上错误太多了:

public void start() {
        // 在调用本线程的 Activity 的 onResume 里调用,以便 Activity 恢复后继续获取麦克风输入音量
        if (!isRun) {
            super.start();
            isRun = true;
        }
    }

 

附:很多录音在模拟器是无法测试的,所以请在真机上测试,也所以才有这个纠结的不好找到源头的错误。

private final static int CHANNEL_MODE = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private final static int ENCODING = AudioFormat.ENCODING_PCM_8BIT;

recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RATE,
                CHANNEL_MODE, ENCODING, CHUNK_SIZE_IN_SAMPLES * 2);

 

我记得貌似只支持这个,频率是最低的吧 起码44100不支持,你可以用AudioRecord.getMinBufferSize这个方法测试一下。有个外国的网站上有人统计过,但是找不到了,忘了保存起来了,只能分享这些了,呵呵。好了,就这些

0
0
分享到:
评论

相关推荐

    bin_audiorecord_audiorecord_QTaudio_

    本项目涉及的是一个基于Qt框架编写的音频录制软件,名为"bin_audiorecord_audiorecord_QTaudio_",它允许用户在Qt平台上进行音频的录制。下面我们将深入探讨这个项目的核心知识点,包括Qt框架和音频录制技术。 首先...

    android的AudioRecord

    6. 释放资源:调用`release()`释放AudioRecord实例占用的资源。 四、语音质量评测 在语音质量评测中,AudioRecord可以用于收集原始音频数据,然后通过一系列算法分析音频的清晰度、失真、噪声等指标。例如: 1. ...

    Android audioRecord录音Demo

    6. **释放资源**:最后,调用`AudioRecord.release()`释放`AudioRecord`对象占用的资源。 在`RecorderTest`这个Demo中,开发者可能还实现了对录音状态的监控,如检查是否成功启动录音,以及处理可能发生的错误。...

    Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小

    4. 结束录音:调用`stop()`方法停止录音,并释放`AudioRecord`资源。 实时获取音量大小通常需要计算音频数据的幅度,这可以通过对PCM数据进行平方平均或峰值检测来实现。例如,可以遍历读取到的每一个样本值,求其...

    利用AudioRecord录制音频并播放

    在Android平台上,AudioRecord类是用于低级别音频输入的关键组件,它可以让我们直接访问设备的音频硬件,进行实时的音频数据录制。在这个项目中,“利用AudioRecord录制音频并播放”,我们将会探讨如何使用Audio...

    基于AudioRecord和OpenSL ES两种框架的采集PCM数据功能的统一封装.zip

    基于AudioRecord和OpenSL ES两种框架的采集PCM数据功能的统一封装 基于AudioRecord和OpenSL ES两种框架的采集PCM数据功能的统一封装 基于AudioRecord和OpenSL ES两种框架的采集PCM数据功能的统一封装 基于Audio...

    AudioRecord录音 AudioTrack播放

    5. 当录音完成后,调用AudioRecord.stop()停止录音,并释放资源。 AudioTrack类则负责将音频数据播放到扬声器。与AudioRecord类似,它也需要初始化,但参数略有不同,包括音频流类型、音频格式、采样率、通道配置、...

    AudioRecord录音代码实例

    在Android平台上,AudioRecord类是用于低级别音频录制的核心组件,而MediaPlayer则用于播放音频文件。本篇文章将深入探讨如何使用AudioRecord进行录音,并利用MediaPlayer进行回放,从而实现一个完整的音频录制与...

    AudioRecord 实现通话双向录音案例

    网上的通话录音大多数都是基于mediarecoder开发的,我最后反编译了一款apk,发现里面用的是audiorecord开发的,下面是我的核心代码展示,良心开发,不要差评谢谢

    Android AudioRecord Demo.zip

    - 使用AudioRecord时,需要注意处理错误状态,如无效的参数或资源繁忙。同时,从Android 6.0(API级别23)开始,录音需要运行时权限,需要在应用中请求`Manifest.permission.RECORD_AUDIO`。 9. **性能优化** - ...

    AudioRecord和AudioTrack

    在Android平台上,AudioRecord和AudioTrack是两个非常重要的音频处理类,它们分别用于音频的录制和播放。在本文中,我们将深入探讨这两个类的工作原理、使用方法以及如何结合它们实现一个简单的音频处理流程。 首先...

    Android下录音及播放录音(AudioRecord)

    当录音结束时,调用`stopRecording()`停止录音,并释放`AudioRecord`资源。 录音完成后,可以将PCM数据保存为文件,例如.wav或.raw格式。在保存文件时,需要在文件头添加相应的格式信息,以便其他软件能正确解析。...

    AudioRecord.zip

    这个"AudioRecord.zip"项目显然是一个关于使用`AudioRecord`进行音频录制和播放的实践示例,具有高度的灵活性,可以调整采样率和文件格式。 1. **AudioRecord类的使用**:`AudioRecord`是Android系统中用于音频输入...

    Android应用源码之AudioRecord_Android.zip

    当录音完成后,调用`stop()`方法停止录音,然后调用`release()`方法释放AudioRecord实例占用的资源,避免内存泄漏。 7. **错误处理和状态检查**: 在录音过程中,应定期检查AudioRecord的状态,如`...

    android使用audioRecord和audioTrack实现语音录音播放与即时播放

    `AudioRecord`和`AudioTrack`是Android SDK提供的一对关键类,分别用于录音和播放音频数据。这两个类允许开发者进行低级别的音频操作,实现更加灵活和高效的声音处理。接下来,我们将深入探讨如何使用`AudioRecord`...

    Audio Record

    《音频录制技术详解——以Audio Record为例》 在数字化时代,音频录制软件成为了音乐创作、教育、会议记录等众多领域的必备工具。本文将以"Audio Record"这款录音软件为切入点,深入探讨音频录制技术的核心概念、...

    AudioRecord_java_

    在Android开发中,AudioRecord是Java API提供的一种用于录制音频数据的类,它允许开发者直接操作音频硬件,获取原始的音频流数据。本项目聚焦于使用AudioRecord实现录音与播放功能,尤其强调即使在锁屏状态下也能...

    AudioRecord的简单应用

    8. **释放资源**:最后,为了防止内存泄漏,我们需要调用AudioRecord.release()来释放AudioRecord对象。 以上就是使用AudioRecord类进行音频录制的基本步骤。在实际应用中,我们可能还需要处理各种异常情况,如权限...

    AudioRecord

    在Android平台上,AudioRecord是Android SDK提供的一种用于音频录制的核心类。它允许开发者直接与设备的音频硬件交互,实现高质量的音频数据录制功能。本文将深入探讨AudioRecord的相关知识点,包括其基本用法、参数...

    Android 使用AudioRecord实现暂停录音功能

    实现暂停录音功能的关键在于停止数据的读取和处理,但不释放`AudioRecord`实例。可以使用一个标志变量来控制录音状态: ```java boolean isRecording = true; // 暂停录音 isRecording = false; // 在循环读取...

Global site tag (gtag.js) - Google Analytics