Android 深入系统完全讲解(31)

Posted 程序员入门进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 深入系统完全讲解(31)相关的知识,希望对你有一定的参考价值。

动态调整目标码率:
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

以上是关于Android 深入系统完全讲解(31)的主要内容,如果未能解决你的问题,请参考以下文章

Android 深入系统完全讲解(31)

Android 深入系统完全讲解(33)

Android 深入系统完全讲解(33)

Android深入系统完全讲解(38)

Android深入系统完全讲解(38)

Android 深入系统完全讲解(25)