之前做的直播设计到音视频编码、rtmp推流、rtmp流播放等内容,现在抽时间整理一下。首先说一下音频编码(pcm 编码得到aac数据)。
1 录音(获取pcm数据)
开始录音
private void startRecord(){
Log.i(TAG, "startRecord mIsRecording="+mIsRecording);
if(!mIsRecording){
mIsRecording = true;
synchronized (mLock) {
mAudioRecordGetExit = false;
}
//初始化ffmpeg 编码器
mFFAacEncoderJni.start();
//创建录音线程、开始录音
mAudioRecordGetThread = new Thread(new AudioRecordGet());
mAudioRecordGetThread.start();
}
}
关闭录音
private void stoptRecord(){
if(mIsRecording){
synchronized (mLock) {
mAudioRecordGetExit = true;
}
mIsRecording = false;
}
}
private class AudioRecordGet implements Runnable{
private AudioRecord mAudioRecord;
private static final boolean PCM_DUMP_DEBUG = true;
private static final boolean AAC_DUMP_DEBUG = false;
private int mAudioSource = MediaRecorder.AudioSource.MIC;
//采样频率,采样频率越高,音质越好。44100 、22050、 8000、4000等
private int mSampleRateHz = 8000;
//MONO为单声道 ,STEREO为双声道
private int mChannelConfig = AudioFormat.CHANNEL_IN_MONO;
//编码格式和采样大小,pcm编码;支持的采样大小16bit和8bit,采样大小越大,信息越多,音质越好。
private int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
//该size设置为AudioRecord.getMinBufferSize(mSampleRateHz, mChannelConfig, mAudioFormat); 编码aac时会失败。
private int mBufferSizeInBytes = 2048;//AudioRecord.getMinBufferSize(mSampleRateHz, mChannelConfig, mAudioFormat);
private AudioPCMData mAudioPCMData;
public AudioRecordGet() {
Log.i(TAG, "AudioRecordGet ");
mAudioPCMData = new AudioPCMData(mBufferSizeInBytes);
mAudioRecord = new AudioRecord(mAudioSource,
mSampleRateHz, mChannelConfig, mAudioFormat, mBuffe