• Android平台 音频录制踩坑记


    Android平台 音频录制播放主要方式有两个:  AudioRecord 和 MediaRecord.

    AudioRecord 是更底层的类, 能够实现边录边播, 通过(AudioRecord 和 AudioTrack组合实现汤姆猫应用等)输出的是pcm语音数据,需要自己实现数据转码才能够播放。

    MediaRecord 主要是 用来录像的,是更偏向于应用层的类。集成了录音 编码 压缩,只支持少量的录音音频格式,如3gp amr acc等

    AudioRecord 是将采集到的 指定声音采样数据的 信息记录在一个相关联的buffer中, 我们可以对裸数据进行操作

    // 获得缓冲区字节大小      
    // 采样频率
    // 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道 // 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。 int bufferSizeInBytes = AudioRecord.getMinBufferSize(AudioFileFunc.AUDIO_SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); // 创建AudioRecord对象 第一个参数:音频获取源 AudioRecord audioRecord = new AudioRecord(AudioFileFunc.AUDIO_INPUT, AudioFileFunc.AUDIO_SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes); try { audioRecord.startRecording(); } catch (IllegalStateException e) { e.printStackTrace(); } new Thread(new AudioRecordThread()).start(); // 开启数据写入线程 class AudioRecordThread implements Runnable { @Override public void run() { writeDateToFile();//往文件中写入数据 listener.onSpeechOver(0); } } private static void writeDateTOFile() { // new一个byte数组用来存一些字节数据,大小为缓冲区大小 final byte[] audiodata = new byte[bufferSizeInBytes]; FileOutputStream fos = null; try { File file = new File(currentFilePath); if (file.exists()) { file.delete(); } file.createNewFile(); fos = new FileOutputStream(file);// 建立一个可存取字节的文件 } catch (Exception e) { e.printStackTrace(); } while (mIsRecording == true) { final int size = audioRecord.read(audiodata, 0, bufferSizeInBytes); if (AudioRecord.ERROR_INVALID_OPERATION != size) { try { fos.write(audiodata); calculateVolume(audiodata, 0, size); } catch (IOException e) { e.printStackTrace(); } } } try { fos.close();// 关闭写入流 } catch (IOException e) { e.printStackTrace(); } } private void close() { if (audioRecord != null) { mIsRecording = false;//停止文件写入 try { audioRecord.stop(); audioRecord.release();//释放资源 } catch (Exception e) { e.printStackTrace(); } audioRecord = null; } }

    MediaRecord:直接指定输出文件 中间过程进行程序介入不太方便。

    MediaRecorder recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(OUTPUT_FILENAME);
    recorder.prepare();
    recorder.start();
    ...
    recorder.stop();
    recorder.release();
    // reset 之后相当于整个record重新构造
    recorder.reset();
  • 相关阅读:
    AC自动机+全概率+记忆化DP UVA 11468 Substring
    java POI技术之导出数据优化(15万条数据1分多钟)
    验证IP端与数据库Ip端是否重复!!!
    JAVA中IP和整数相互转化(含有掩码的计算)
    Nginx搭建反向代理服务器过程详解
    session原理及实现共享
    Linux部署多个tomcat
    linux下怎么修改mysql的字符集编码
    linux yum 安装mysql
    VM虚拟机下的Linux不能上网
  • 原文地址:https://www.cnblogs.com/lesten/p/9726390.html
Copyright © 2020-2023  润新知