概述
由于项目需要我这个一直只做video的小菜鸟开始学习audio了,针对新需求,我们首先需要写一个测试demo……万丈高楼平地起,今天就介绍下录音demo的编写:
talk is sample, show me the code:
int main(int argc __unused, char **argv __unused)
{
// step1: 创建MediaRecorder
MediaRecorder *mRecorder = new MediaRecorder(String16("com.test.mediarecorder")); // 此处要输入app package name
// step2: 设置audiosource,具体audiosource分类见下表
mRecorder->setAudioSource(VOICE_UPLINK);
// step3: 设置一些参数,具体可以设置的参数可以参考google的官方文档。
const String8 params1("audio-param-sampling-rate=16000"); // 设置采样率为16khz
mRecorder->setParameters(params1);
const String8 params2("audio-param-number-of-channels=2"); // 设置录制内容为双声道
mRecorder->setParameters(params2);
const String8 params3("audio-param-encoding-bitrate=256000"); // 设置编码码率为256kbps
mRecorder->setParameters(params3);
// step4: 设置输出文件,此处需要注意selinux权限,如果只是debug用可以关闭selinux检测: adb shell setenforce 0
FILE* fd = fopen("/data/local/tmp/recoder.aac", "wb+");
mRecorder->setOutputFile(fileno(fd)); // FILE*和linux文件描述符的转换: fileno(fd)
// step5: 设置输出文件的格式
mRecorder->setOutputFormat(OUTPUT_FORMAT_DEFAULT);
// step6: 设置audio编码器
mRecorder->setAudioEncoder(AUDIO_ENCODER_AAC);
// step7: prepare
mRecorder->prepare();
// step8: 开始录音
mRecorder->start();
// step9: 设置sleep时间,也就是录音时间
sleep(20);
// step10: 结束录制,关闭文件
mRecorder->stop();
fclose(fd);
return 0;
}
以上就是整个demo的代码了,是不是so easy!!!接下来看看设置的AudioSource/OutputFormat和AudioEncoder都有什么。
AudioSource输入源介绍:
AudioSource | 介绍 | 权限 |
DEFAULT | 默认。在源码 system/media/audio/include/system/audio.h配置默认项 | 无 |
MIC | 麦克风 | 无 |
VOICE_UPLINK | 电话录音上行线路 | android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用 |
VOICE_DOWNLINK | 电话录音下行线路 | android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用 |
VOICE_CALL | 电话录音上下线路 | android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用 |
CAMCORDER | 摄像头的麦克风 | 无 |
VOICE_RECOGNITION | 语音识别 | 无 |
VOICE_COMMUNICATION | 网络电话 | 无 |
REMOTE_SUBMIX | 传输到远程的音频混合流。默认情况下如何用该项录音,本地扬声器或者耳机的声音将会被截走 | android.permission.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用 |
OutputFormat输出格式介绍:
OutputFormat | 介绍 |
OUTPUT_FORMAT_DEFAULT | 默认格式,系统自动推荐 常量值:1 |
OUTPUT_FORMAT_RAW_AMR | 已经弃用,不推荐 常量值:3 |
OUTPUT_FORMAT_AMR_NB | amr 采样8khz 常量值:3 |
OUTPUT_FORMAT_AMR_WB | amr 采样16khz 常量值:4 |
OUTPUT_FORMAT_AAC_ADIF | ADIF:Audio Data Interchange Format 音频数据交换格式。每帧都有自己的头信息,可以任意解码。故这种格式常用在磁盘文件中。 常量值: 5 |
OUTPUT_FORMAT_AAC_ADTS | ADTS的全称是Audio Data Transport Stream。是AAC音频的传输流格式。ADIF只有一个统一的头,所以必须得到所有的数据后解码。 常量值: 6 |
AudioEncoder编码器介绍:
AudioEncoder | 介绍 |
AUDIO_ENCODER_AMR_NB | amr编码器,8khz |
AUDIO_ENCODER_AMR_WB | amr编码器,16khz |
AUDIO_ENCODER_AAC | aac编码器 |
AUDIO_ENCODER_HE_AAC | he: high efficiency HE-AAC注重于低码流的编码并很适合多声道文件 |
AUDIO_ENCODER_AAC_ELD | AAC-ELD(增强低延迟) |
AUDIO_ENCODER_VORBIS | VORBIS编码 |
AUDIO_ENCODER_OPUS....... | opus编码 |
以上就是所有demo所有内容,看似超级简单,实际也会有很多坑,例如文件的权限问题,各个函数的调用顺序,app pakeage name在底层是否会被mute等等。
audio框架相比video更加庞大和复杂,尤其是各种场景的交互。“日拱一卒,不期而至。“ 相信总有一天可以搞明白整个框架。
最后
以上就是昏睡宝马为你收集整理的Android-audio之录音demo的全部内容,希望文章能够帮你解决Android-audio之录音demo所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复