上篇文章我们介绍了音频输出(音乐播放),本文将介绍音频的录音即输入,文章中代码坏境Android 4.4

音频输入类:

MediaRecorder

AudioRecord

首先录制音频需要在 AndroidManifest.xml 中加入权限

1、MediaRecorder

MediaRecorder是Android 提供媒体文件录制的类,可以录制视频和音频,我们这主要的是录制音频,下面先看一段录音的代码:

package com.example.framework;

import java.io.File;

import android.app.Activity;

import android.media.MediaRecorder;

import android.media.MediaRecorder.AudioEncoder;

import android.media.MediaRecorder.AudioSource;

import android.media.MediaRecorder.OutputFormat;

import android.os.Bundle;

public class MediaRecorderActivity extends Activity {

private MediaRecorder mRediaRecorder;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

try {

String path = new File(getCacheDir(), "audio.mp4").getAbsolutePath();

mRediaRecorder = new MediaRecorder();

mRediaRecorder.setAudioChannels(2);

mRediaRecorder.setAudioSource(AudioSource.MIC);

mRediaRecorder.setAudioSamplingRate(44100);

mRediaRecorder.setOutputFormat(OutputFormat.MPEG_4);

mRediaRecorder.setOutputFile(path);

mRediaRecorder.setAudioEncoder(AudioEncoder.DEFAULT);

mRediaRecorder.prepare();

mRediaRecorder.start();

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

protected void onDestroy() {

super.onDestroy();

if (mRediaRecorder != null) {

mRediaRecorder.stop();

mRediaRecorder.release();

}

}

}

参数说明:

AudioChannels

声道,Android中取值范围:1或者2,1代表单声道,2代表双声道(立体声)

AudioSource

音频源,Android中已经定义好常量,android.media.MediaRecorder.AudioSource 类

public final class AudioSource {

private AudioSource() {}

/** Default audio source **/

public static final int DEFAULT = 0;

/** Microphone audio source */

public static final int MIC = 1;

/** Voice call uplink (Tx) audio source */

public static final int VOICE_UPLINK = 2;

/** Voice call downlink (Rx) audio source */

public static final int VOICE_DOWNLINK = 3;

/** Voice call uplink + downlink audio source */

public static final int VOICE_CALL = 4;

/** Microphone audio source with same orientation as camera if available, the main

* device microphone otherwise */

public static final int CAMCORDER = 5;

public static final int VOICE_RECOGNITION = 6;

public static final int VOICE_COMMUNICATION = 7;

public static final int REMOTE_SUBMIX = 8;

}AudioSource.DEFAULT 默认

AudioSource.MIC  麦克风

AudioSource.VOICE_UPLINK  电话上行

AudioSource.VOICE_DOWNLINK 电话下行

AudioSource.VOICE_CALL 电话 上行+下行

AudioSource.CAMCORDER 摄像机

AudioSource.VOICE_RECOGNITION 语音识别

AudioSource.VOICE_COMMUNICATION 语音通信,例如VoIP

AudioSource.REMOTE_SUBMIX 远程声音,例如wifi display

电话录音:AudioSource.VOICE_UPLINK,AudioSource.VOICE_DOWNLINK,AudioSource.VOICE_CALL 需要系统权限

AudioSource.REMOTE_SUBMIX 需要在AndroidManifest中加入

SamplingRate

采样率,一般取值范围在8000-48000,取值越大声音越好,采样率高文件也会更大

OutputFormat

输出格式,Android中已经定义好常量,android.media.MediaRecorder.OutputFormat 类

public final class OutputFormat {

private OutputFormat() {}

public static final int DEFAULT = 0;

/** 3GPP media file format*/

public static final int THREE_GPP = 1;

/** MPEG4 media file format*/

public static final int MPEG_4 = 2;

/** The following formats are audio only .aac or .amr formats */

/**

* AMR NB file format

* @deprecated Deprecated in favor of MediaRecorder.OutputFormat.AMR_NB

*/

public static final int RAW_AMR = 3;

/** AMR NB file format */

public static final int AMR_NB = 3;

/** AMR WB file format */

public static final int AMR_WB = 4;

/** @hide AAC ADIF file format */

public static final int AAC_ADIF = 5;

/** AAC ADTS file format */

public static final int AAC_ADTS = 6;

/** @hide Stream over a socket, limited to a single stream */

public static final int OUTPUT_FORMAT_RTP_AVP = 7;

/** @hide H.264/AAC data encapsulated in MPEG2/TS */

public static final int OUTPUT_FORMAT_MPEG2TS = 8;

}介绍几种常用的格式, @hide 隐藏的,开发中避免使用,新的版本中就可能去掉该格式的支持。

OutputFormat.THREE_GPP

3gp格式

OutputFormat.MPEG_4

mp4格式

OutputFormat.AMR_NB

OutputFormat.AMR_WB

AMR_NB和AMR_WB的算法不一样.

OutputFormat.AAC_ADTS

ADTS 全称是(Audio Data Transport Stream) 主要用于音频流传输.

文件格式中并没有看到MP3,Android暂时不支持MP3格式,可以自己录制PCM数据编码成MP3 ,后面我们会介绍PCM数据的录制

OutputFile

录音的文件保存路径

AudioEncoder

音频编码,编码定义常量类,android.media.MediaRecorder.AudioEncoder

public final class AudioEncoder {

/* Do not change these values without updating their counterparts

* in include/media/mediarecorder.h!

*/

private AudioEncoder() {}

public static final int DEFAULT = 0;

/** AMR (Narrowband) audio codec */

public static final int AMR_NB = 1;

/** AMR (Wideband) audio codec */

public static final int AMR_WB = 2;

/** AAC Low Complexity (AAC-LC) audio codec */

public static final int AAC = 3;

/** High Efficiency AAC (HE-AAC) audio codec */

public static final int HE_AAC = 4;

/** Enhanced Low Delay AAC (AAC-ELD) audio codec */

public static final int AAC_ELD = 5;

}对于不同的文件格式选择不同的编码

录制MP4或者AAC_ADTS格式时选用编码 AudioEncoder.AAC,AudioEncoder.HE_AAC,AudioEncoder.AAC_ELD

录制3gp或者amr格式时选用编码 AudioEncoder.AMR_NB,AudioEncoder.AMR_WB

MediaRecorder录音的主要步骤

1:设置参数

2:prepare 准备

3:start 开始录音

4:stop 停止录音

5:release 释放资源

2、AudioRecord

AudioRecord 低级API,录制的是PCM数据,没有经过压缩,先看Demo

package com.example.framework;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import android.app.Activity;

import android.media.AudioFormat;

import android.media.AudioRecord;

import android.media.MediaRecorder.AudioSource;

import android.os.Bundle;

public class AudioRecordActivity extends Activity implements Runnable {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

new Thread(this).start();

}

@Override

public void run() {

BufferedOutputStream bos = null;

AudioRecord audioRecord = null;

try {

int audioSource = AudioSource.MIC;

int sampleRateInHz = 44100;

int channelConfig = AudioFormat.CHANNEL_OUT_STEREO;

int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat) * 2;

audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);

audioRecord.startRecording();

bos = new BufferedOutputStream(new FileOutputStream(new File(getCacheDir(), "audio.pcm")));

byte[] buffer = new byte[bufferSizeInBytes];

int len = 0;

while (!isFinishing()) {

len = audioRecord.read(buffer, 0, bufferSizeInBytes);

if (len <= 0) {

break;

}

bos.write(buffer, 0, len);

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if (bos != null) {

try {

bos.close();

} catch (IOException e) {}

}

if (audioRecord != null) {

audioRecord.release();

}

}

}

}上面的代码是录制麦克风的数据,将录制之后的数据写入"audio.pcm" 文件。 AudioRecord 主要参数说明 audioSource 和MediaRecorder的一样。 sampleRateInHz  和MediaRecorder的一样。 channelConfig   和MediaRecorder 不一样,AudioFormat.CHANNEL_OUT_STEREO或者AudioFormat.CHANNEL_OUT_STEREO audioFormat AudioFormat.ENCODING_PCM_8BIT 或者 AudioFormat.ENCODING_PCM_16BIT bufferSizeInBytes 音频缓冲区大小,使用AudioRecord.getMinBufferSize 方法可以获取最小的缓冲区,上面的代码是获取最小的缓冲区乘以2 AudioRecord 的步骤: 1、设置参数 2、startRecording 开始录音 3、read 读取录制的数据 4、release 释放资源 当我们调用startRecording之后就可以调用read方法从系统中读取音频的PCM数据 read方法的返回值:返回的是读取的数据len,如果大于0读取数据成功,否则读取失败. 总结:MediaRecorder 功能比较强大,录制压缩格式,AudioRecord录制的是PCM数据,在实际开发中两个都有可能用到。

java 3gpp转mp3_Android 音频 Framework层 音频输入 录音 Java API相关推荐

  1. java 3gpp转mp3_Android音频以及音频播放器开发实例

    Android 系统支持三种不同来源的音频播放: 1)本地资源 存储在应用程序中的资源,例如存储在 RAW 文件夹下的媒体文件,只能被当前应用程序访问. 2)外部资源 存储在文件系统中的标准媒体文件, ...

  2. Android Framework中的Application Framework层介绍

    Android的四层架构相比大家都很清楚,老生常谈的说一下分别为: Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework. Framework层为我们开 ...

  3. android l camera no panorama,Android Camera从App层到framework层到HAL层的初始化过程

    Android camera 从上到下能够分为四个部分: Application层. framework层. HAL(hardware abstract layer)层. Kernel层 通常面向开发 ...

  4. 【Android N7.0】Framework层实现派发HOME按键到Application层的一种简单方案

    frameworks/base/core/java/android/view/WindowManager.java frameworks/base/services/core/java/com/and ...

  5. 初识Android framework层

    Android系统的构成如下,从上到下依次是 Application应用层 Framework框架层 LIbrary系统库层 Linux内核层 关于Framework层: Android的Framew ...

  6. 睡眠音频分割及识别问题(十)--Java读取wav文件

    简介 Waveform Audio File Format(WAVE,又或者是因为扩展名而被大众所知的 wav),是微软与 IBM公司所开发在个人电脑存储音频流的编码格式. 由于项目需要从 wav 文 ...

  7. java flv转mp3_【转载】音频视频转化工具JAVE(ffmpeg的Java封装)

    JAVE (Java Audio Video Encoder) 类库是一个 ffmpeg 项目的 Java 语言封装.开发人员可以使用JAVE 在不同的格式间转换视频和音频.例如将 AVI 转成 MP ...

  8. 在java中使用FFmpeg将图片和音频合成视频

    下面分享一个我之前在java中使用FFmpeg将图片和音频合成视频的demo. package com.xxx.console.videoProcess;import java.awt.image.B ...

  9. android音频hal层简介

    如下图为android音频hal层所处的位置: 从上图可以看出,HAL层下面使用TiniAlsa(Android下一个简约的Alsa版本).HAL层分为两部分,一部分为各种音频设备,每种音频设备由一个 ...

最新文章

  1. 为计算机编程序英语作文,计算机编程员英文简历范文
  2. 《算法竞赛中的初等数论》(五)正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)
  3. ARP欺骗防御工具arpon
  4. 在Flutter中解析复杂的JSON(一篇顶十篇)
  5. 轻松学Linux之使用转义字符
  6. MySQL计划任务3(转)
  7. 利用bobo-browse 实现lucene的分组统计功能
  8. 齐次坐标和单应性矩阵
  9. linux中下载python_linux下python安装
  10. WIN7(32位)VS2010+openCV 2.4.10+PCL 1.6.0+CUDA 6.5.14+CMake 3.2.1+SSBA-3.0配置
  11. RGB565 转 HSV C语言实现
  12. 入门知识(一)矢量图与位图的区别
  13. curl做IP代理刷百度广告的计费问题
  14. android手机直播推流
  15. 出版图书二维码,要如何制作呢?
  16. 简转繁的JS代码(转)
  17. 哪个录音软件最好用?推荐几款录音软件给你
  18. java四叶玫瑰_java编一个四叶玫瑰曲线 不显示曲线
  19. Ubuntu下使用ROS moveit 连接ABB机器人
  20. 国家网络信息安全第一章

热门文章

  1. 嵌入式Linux驱动难?到底难在哪?
  2. HTML+CSS简单实例(一)
  3. 上海交大SEED-IV数据集眼动信号介绍
  4. 自然语言处理和计算机视觉相关论文总结
  5. 6.Linux运维常用命令
  6. MPEG-2 最后一个美国专利已于2018 年 2月过期
  7. LaTeX初学者模板 控制纸张大小
  8. 使用System.Convert.ToString将字符串转换成utf16进制编码
  9. 网络对战游戏开发 从零开始(一)
  10. 递归的选择排序(C语言)