package com.laifeng.sopcastsdk.audio; import android.annotation.TargetApi; import android.media.MediaCodec; import com.laifeng.sopcastsdk.configuration.AudioConfiguration; import com.laifeng.sopcastsdk.mediacodec.AudioMediaCodec; import java.nio.ByteBuffer; /** * @Title: AudioEncoder * @Package com.laifeng.sopcastsdk.audio * @Description: * @Author Jim * @Date 16/9/19 * @Time 上午9:57 * @Version */ @TargetApi(18) public class AudioEncoder { private MediaCodec mMediaCodec; private OnAudioEncodeListener mListener; private AudioConfiguration mAudioConfiguration; MediaCodec.BufferInfo mBufferInfo = new MediaCodec.BufferInfo(); public void setOnAudioEncodeListener(OnAudioEncodeListener listener) { mListener = listener; } public AudioEncoder(AudioConfiguration audioConfiguration) { mAudioConfiguration = audioConfiguration; } void prepareEncoder() { mMediaCodec = AudioMediaCodec.getAudioMediaCodec(mAudioConfiguration); mMediaCodec.start(); } synchronized public void stop() { if (mMediaCodec != null) { mMediaCodec.stop(); mMediaCodec.release(); mMediaCodec = null; } } synchronized void offerEncoder(byte[] input) { if(mMediaCodec == null) { return; } ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers(); ByteBuffer[] outputBuffers = mMediaCodec.getOutputBuffers(); int inputBufferIndex = mMediaCodec.dequeueInputBuffer(12000); if (inputBufferIndex >= 0) { ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; inputBuffer.clear(); inputBuffer.put(input); mMediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0); } int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(mBufferInfo, 12000); while (outputBufferIndex >= 0) { ByteBuffer outputBuffer = outputBuffers[outputBufferIndex]; if(mListener != null) { mListener.onAudioEncode(outputBuffer, mBufferInfo); } mMediaCodec.releaseOutputBuffer(outputBufferIndex, false); outputBufferIndex = mMediaCodec.dequeueOutputBuffer(mBufferInfo, 0); } } }