SpyDroid源码分析系列16:SpyDroid上传AAC音频原理6

新的一周开始了,继续研究SpyDroid源码,之前做项目的时候,SpyDroid源码跟现在的源码变化还是有的,看来这个源码项目一直在进行。

~~~~~~~~~~~~~~~~~~~~~~~~~继续研究

下面执行:

mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, mQuality.samplingRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
//声音来源:麦克风
//采样率:8000
//声道数
//编码方式,原始数据必须编码
//缓冲区大小
//自定义检查点: 1 2 3

~~~~~~~~

mMediaCodec = MediaCodec.createEncoderByType("audio/mp4a-latm");

//构造一个编码器

!~~~~



mMediaCodec = MediaCodec.createEncoderByType("audio/mp4a-latm");
//自定义检查点: 1 2 3
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
//格式为audio/mp4a-latm
format.setInteger(MediaFormat.KEY_BIT_RATE, mQuality.bitRate);
//位速
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
//频道数

format.setInteger(MediaFormat.KEY_SAMPLE_RATE, mQuality.samplingRate);
//采样率
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
//AAC文件
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, bufferSize);
//最大输入缓冲区
//自定义检查点: 1 2 3
~~~~~~~~~~~~~~~~~~~~~~~~~

mMediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
//设置格式
//自定义检查点 : 1 2 3
~~~~~~~~~~~~~~~~~~~~~

mAudioRecord.startRecording();
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!开始产生数据

~~~~~~~

mMediaCodec.start();
//开始编码

~~~~~~~~~~~

final MediaCodecInputStream inputStream = new MediaCodecInputStream(mMediaCodec);
final ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();
//获取数据及缓冲区

~~~~~~~~~~下面是获取数据

mThread = new Thread(new Runnable() 
{
@Override
public void run() 
{
int len = 0, bufferIndex = 0;
try {
while (!Thread.interrupted()) 
{
bufferIndex = mMediaCodec.dequeueInputBuffer(10000);
//出队
if (bufferIndex>=0) 
{
inputBuffers[bufferIndex].clear();
len = mAudioRecord.read(inputBuffers[bufferIndex], bufferSize);
if (len ==  AudioRecord.ERROR_INVALID_OPERATION || len == AudioRecord.ERROR_BAD_VALUE) {
Log.e(TAG,"An error occured with the AudioRecord API !");

else 
{
//Log.v(TAG,"Pushing raw audio to the decoder: len="+len+" bs: "+inputBuffers[bufferIndex].capacity());
mMediaCodec.queueInputBuffer(bufferIndex, 0, len, System.nanoTime()/1000, 0);
}
}
}
} catch (RuntimeException e) {
e.printStackTrace();
}
//Log.e(TAG,"Thread 1 over");
}
});


mThread.start();
//已经获取到了原始数据及编码后的数据

启动了一个线程。

~~~~~~~~~~~~~那么,谁来用一个线程来读取数据并发送呢?我们继续往下看。

我们在下一节来解答这个问题。

注意:本文中有大量的Android平台的硬件及音频知识,理解即可,不用过于深究。

你可能感兴趣的:(audio,audiorecord,RTP,rtcp,SpyDroid)