Android 深入系统完全讲解(31)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
动态调整目标码率
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
mediaFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
mVideoCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Bundle param = new Bundle();
param.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, bitrate);
mediaCodec.setParameters(param);
再继续讲的时候我来说下当前我们学习的知识学会了如何显示图像多种方式以及视
频数据来源视频解码采集画面以及音频。 音视频采集+混合
音频采集用 AudioRecord 录音然后实时的写入数据就可以了原始数据格式 PCM。
//默认参数
private static final int AUDIO_SOURCE = MediaRecorder.AudioSource.MIC;
private static final int SAMPLE_RATE = 44100;
private static final int CHANNEL_CONFIGS = AudioFormat.CHANNEL_IN_STEREO;
private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIGS, AUDIO_FORMAT);
private AudioRecord audioRecord;
public void start() {
start(AUDIO_SOURCE, SAMPLE_RATE, CHANNEL_CONFIGS, AUDIO_FORMAT);
}
public void start(int audioSource, int sampleRate, int channels, int audioFormat) {if (isStartRecord) {
Log.d(TAG, “音频录制已经开启”);
return;
}
bufferSize = AudioRecord.getMinBufferSize(sampleRate, channels, audioFormat);
if (bufferSize == AudioRecord.ERROR_BAD_VALUE) {
Log.d(TAG, “无效参数”);
return;
}
audioRecord = new AudioRecord(audioSource, sampleRate, channels, audioFormat, bufferSize);
audioRecord.startRecording();
isStopRecord = false;
threadCapture = new Thread(new CaptureRunnable());
threadCapture.start();
}
设置后开始后就可以在循环体去写入了。
/**
- 子线程读取采集到的 PCM 数据
*/
private class CaptureRunnable implements Runnable {
@Override
public void run() {
while (!isStopRecord) {
byte[] buffer = new byte[bufferSize];
int readRecord = audioRecord.read(buffer, 0, bufferSize);
if (readRecord > 0) {
if (captureListener != null)
captureListener.onCaptureListener(buffer,readRecord);
Log.d(TAG, " 音 频 采 集 数 据 源 –
“.concat(String.valueOf(readRecord)).concat(” – bytes"));
} else {
Log.d(TAG, “录音采集异常”);
}
//延迟写入 SystemClock – Android 专用
SystemClock.sleep(10);}
}
}
格式转化需要使用 MediaCodec 当前是默认的 PCM需要转化成 AAC合成使用的是
MediaMuxer。
这里看下转化器
private MediaCodec mAudioCodec;
String audioType = MediaFormat.MIMETYPE_AUDIO_AAC; //编码成 aac 格式
int sampleRate = 44100;
int channels = 2;//单声道 channelCount=1 , 双声道 channelCount=2
private void initAudioCodec(String audioType, int sampleRate, int channels) {
try {
mAudioCodec = MediaCodec.createEncoderByType(audioType);
MediaFormat audioFormat = MediaFormat.createAudioFormat(audioType, sampleRate, channels);
int BIT_RATE = 96000;
audioFormat.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE);
audioFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
int MAX_INOUT_SIZE = 8192;
audioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, MAX_INOUT_SIZE);
mAudioCodec.configure(audioFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
} catch (IOException e) {
Log.e(TAG, “initAudioCodec: 音频类型无效”);
}
}
这里分享一份源码大家可以参考。
https://github.com/renhui/AndroidRecorder/releases/tag/h264_video_audio