在Android开发中,录音功能的实现主要依赖于两个API:MediaRecorder和AudioRecord,这两个API各有特点,适用于不同的场景,以下是对这两个API的详细介绍以及使用示例代码。
MediaRecorder
简介
功能集成:MediaRecorder已经集成了录音、编码、压缩等功能,使用起来相对简单。
音频格式:支持少量的录音音频格式,如AAC、AMR、3GP等。
优点:代码量小,易于实现基本的录音功能。
缺点:无法实时处理音频数据,输出的音频格式有限。
示例代码
public class MediaRecordingUtils { private String filePath; private MediaRecorder mMediaRecorder; private final String TAG = "fan"; public static final int MAX_LENGTH = 1000 * 60 * 200; // 最大录音时长,单位毫秒 private OnAudioStatusUpdateListener audioStatusUpdateListener; public MediaRecordingUtils() { } public MediaRecordingUtils(String filePath) { this.filePath = filePath; } private long startTime; private long endTime; public void startRecord() { // 开始录音 if (mMediaRecorder == null) mMediaRecorder = new MediaRecorder(); try { mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置麦克风 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a"; if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) { FileUtils.makeFolders(audioSaveDir); } filePath = audioSaveDir + fileName; mMediaRecorder.setOutputFile(filePath); mMediaRecorder.setMaxDuration(MAX_LENGTH); mMediaRecorder.prepare(); mMediaRecorder.start(); startTime = System.currentTimeMillis(); updateMicStatus(); Log.e(TAG, "startTime" + startTime); } catch (IllegalStateException | IOException e) { Log.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage()); } } public void stopRecord() { try { mMediaRecorder.stop(); mMediaRecorder.release(); mMediaRecorder = null; filePath = ""; } catch (RuntimeException e) { Log.e(e.toString()); mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; File file = new File(filePath); if (file.exists()) file.delete(); filePath = ""; } } }
AudioRecord
简介
实时处理:AudioRecord主要用于实时处理音频数据,可以实现边录边播的功能。
数据格式:输出的是PCM语音数据,需要进一步编码和压缩才能保存为音频文件。
优点:灵活性高,可以实现复杂的音频处理功能。
缺点:使用较为复杂,需要手动处理音频数据的编码和压缩。
示例代码
public class AudioRecordingUtils { private AudioRecord mAudioRecord; private boolean isRecording = false; private int sampleRateInHz = 44100; // 采样率 private int channelConfig = AudioFormat.CHANNEL_IN_MONO; // 单声道输入 private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // PCM 16位编码 private int minBufferSize; private byte[] buffer; private String filePath; private FileOutputStream fos; public AudioRecordingUtils(String filePath) { this.filePath = filePath; minBufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); buffer = new byte[minBufferSize]; mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, audioFormat, minBufferSize, buffer); try { fos = new FileOutputStream(filePath); } catch (FileNotFoundException e) { e.printStackTrace(); } } public void startRecording() { mAudioRecord.startRecording(); isRecording = true; new Thread(new Runnable() { @Override public void run() { while (isRecording) { int read = mAudioRecord.read(buffer, 0, buffer.length); if (AudioRecord.ERROR_INVALID_OPERATION != read) { try { fos.write(buffer, 0, read); } catch (IOException e) { e.printStackTrace(); } } } } }).start(); } public void stopRecording() { isRecording = false; mAudioRecord.stop(); try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
相关问题与解答栏目
问题1:如何在Android 10及以上版本中处理录音权限的变化?
答:在Android 10(API级别29)及更高版本中,引入了新的隐私权限机制,包括“录音焦点”的概念,这意味着即使应用获得了录音权限,如果另一个应用正在使用麦克风,您的应用可能仍无法录音,为了处理这种情况,您可以使用AudioManager
来查询当前是否有其他应用占用了录音焦点,并在适当的时候请求录音焦点。
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); if (audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // 获得录音焦点,可以开始录音 } else { // 未获得录音焦点,提示用户或等待 }
您需要在AndroidManifest.xml
中声明相应的权限,并在运行时请求这些权限,还需要在res/xml/
目录下创建一个permission_microphone.xml
文件来描述所需的权限。
各位小伙伴们,我刚刚为大家分享了有关“android录音api”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/625990.html