博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android pcm
阅读量:5110 次
发布时间:2019-06-13

本文共 3368 字,大约阅读时间需要 11 分钟。

 

Android.media package里包含声音录放的两个类AudioRecord和AudioTrack。前者用来录制,后者用来播放。
配置 pcm:
1 int channel = AudioFormat.CHANNEL_IN_MONO ;2 int format = AudioFormat.ENCODING_PCM_16BIT;3 int sampleRate = 8000 ; 4 int minBufferSize = AudioRecord.getMinBufferSize ( sampleRate, channel , format  ) * 4;
声明:
1 AudioRecord audioRecord = new AudioRecord (MediaRecoder.AudioResource.DEFAULT, sampleRate, AudioFormat.CHANNEL_IN_STEROE, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);

装pcm和MP3的buffer:

1 short[] buffer = new short[sampleRate * (16 / 8) * 2 * 5];2 byte[] mp3buffer = new byte[(int) (7200 + buffer.length * 2 * 1.25)];

转码器初始化:

1 MP3Recorder.init(sampleRate, 2, sampleRate, 192);

这是转码:

1 // MP3 转码2 int encResult = MP3Recorder.encode(buffer, buffer, readSize, mp3buffer);

 

两个接口:

 AudioRecord 的构造函数:public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

第一个参数是音源,可以是从MicroPhone( MediaRecorder.AudioSource.MIC),也可以是通话的话音( MediaRecorder.AudioSource.VOICE_CALL,MediaRecorder.AudioSource.VOICE_DOWNLINK即对方声音,MediaRecorder.AudioSource.VOICE_UPLINK即本方声音 )

第二个参数是期望录音的采样频率,比如8000,16000,44100等

第三个参数是期望录音的声道数,可以是AudioFormat.CHANNEL_IN_MONO 和 AudioFormat.CHANNEL_STEREO.

第四个参数是期望录音的比特数,可以是AudioFormat.ENCODING_PCM_16BIT和AudioFormat.ENCODING_PCM_8BIT.

第五个参数是期望录音时系统为其提供的缓冲区大小,必须大于使用AudioRecord.getMinBufferSize() 得出的大小,这个参数指定的数值愈大,可以有更长的缓冲时间,也就是可以间隔较长的时间调用AudioRecord.read 函数从底层取得数据也不会溢出。

关于第一参数指定录制电话通话时,有的手机可以,有的手机不行。不行的原因是因为平台没有实现这个功能。

startRecording()之后就可以不断调用 read函数取得声音数据。这个函数是阻塞试的,下层没有足够的数据会停在它里面。

一般来说,在一个独立线程里处理录音的数据采集比较好。

AudioTrack的构造函数

AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode)

第一个参数 是选择流的种类,一般来说从喇叭放音选择 STREAM_MUSIC

最后一个参数是表示一次性把数据传给 AudioTrack还是连续不断地使用  write 函数传数据。我这里选择 MODE_STREAM

还有几个函数要在这里说一下。

write也是阻塞式的,下面的数据满了的话,会在它里面等待。

getHeadPosition()返回值表示当前已经播放了多少帧(1帧就是采样一次的意思,比如采样率是8000的话,那么1秒钟就是8000帧)

AudioTrack.OnPlaybackPositionUpdateListener 声明两个方法:

onMarkerReached(AudioTrack track )

onPeriodicNotification(AudioTrack track )

这两个方法由客户实现,通过 setPlaybackPositionUpdateListener 把该接口的实现类设进去。

通过 setNotificationMarkerPosition 设定一个marker位置,当声音播放到这个位置时,就启动onMarkerReached 方法。

通过 setPositionNotificationPeriod 设定一个周期,然后每播放了这个周期的声音时,就会启动 onPeriodicNotification 的周期。

getHeadPosition  , onMarkerReached , onPeriodicNotification 可以方便的取得声音播放的时间,了解声音的节奏,可以用来和视频和字幕同步。 

 

e.g.

1 录制:  2 int minBuffSize = AudioRecord.getMinBufferSize(8000,  3 AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT);  4   AudioRecord mAudioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,  5           AudioFormat.CHANNEL_CONFIGURATION_MONO,  6           AudioFormat.ENCODING_PCM_16BIT, minBuffSize*3);  7 //开始录音  8 mAudioRecorder.startRecording();  9 10 byte[] mBuffer = new byte[minBuffSize*3]; 11 //从MIC获取音频数据到mBuffer中 12 13 int len = mAudioRecorder.read(mBuffer, 0, 1200);

 

1 播放:  2 int iMinBufSize = AudioTrack.getMinBufferSize(8000,   3 AudioFormat.CHANNEL_CONFIGURATION_STEREO,  4             AudioFormat.ENCODING_PCM_16BIT);  5 AudioTrack audioTrack=new AudioTrack(AudioManager.STREAM_MUSIC, 8000,  6 AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT,  7 iMinBufSize, AudioTrack.MODE_STREAM) ;  8  9 audioTrack.play(); 10 audioTrack.write(data, 0, data.length);

 

转载于:https://www.cnblogs.com/CharlesGrant/p/4762751.html

你可能感兴趣的文章
Eclipse相关集锦
查看>>
虚拟化架构中小型机构通用虚拟化架构
查看>>
继承条款effecitve c++ 条款41-45
查看>>
[置顶] OGG-01091 Unable to open file (error 89, Invalid file system control data detected)
查看>>
Myeclipse 连接MSSqlServer
查看>>
redis启动流程介绍
查看>>
dell T420热插拔安装过程
查看>>
linux 内核参数VM调优 之 参数调节和场景分析
查看>>
HTML+CSS学习笔记(九)
查看>>
学会提问——读后感
查看>>
mysql按30分钟进行分组
查看>>
SOSP 文档 - Windows Azure 存储:具有强一致性的高可用性云存储服务
查看>>
用Visual studio2012在Windows8上开发内核中隐藏进程
查看>>
OO第八次作业
查看>>
Java与Python下载Bing首页图片
查看>>
QBXT模拟赛T3
查看>>
对于eclipse新建maven工程需要注意的地方。
查看>>
笑谈人生的哲理和智慧
查看>>
【BZOJ2286】【SDOI2011】消耗战 [虚树][树形DP]
查看>>
【Foreign】Game [博弈论][DP]
查看>>