
本文共 10127 字,大约阅读时间需要 33 分钟。
MediaCodec ������ AAC ���������������
1. MediaCodec ������
MediaCodec ������ Android ��������������������������������������������������������������������������������������������������������� MediaExtractor���MediaSync���MediaMuxer���MediaCrypto���MediaDrm ������������������������MediaCodec ���������������������������������������������������������������������������������������
MediaCodec ���������
������ MediaCodec encoding AAC ������������������������������������������������������������
������������������������������������������������������ BUFFER FLAG END OF STREAM ������������������������������������������������������������������������������������������������������������������������������
2. ������ MediaCodec ������ AAC ���������
������ AAC ������������������������������������������
������������������������������ MediaCodecList ���������������������������������
������ MediaCodec ������������������������������������ MediaCodec ���������
������ MediaFormat������������������������������������������������������������������������������
������������������������ configure ��������� MediaFormat ���ml������������������������ MediaCodec���
��������������������������� start ���������������������
��������������� PCM ��������������� AudioRecord ������ PCM ������������������������ MediaCodec���
������������������������������������������������������������ AAC ������������������������������
��������������������������������������������������� stop ��� release ������������ MediaCodec ���������
��������������� AAC ������������������������������������
public class MediaCodecAACExample { private MediaCodec mCodec; private MediaFormat mediaFormat; // ��������� MediaCodec ��� MediaFormat private void initMediaCodec(int sampleRate, int channelCount) { MediaCodecInfo info = MediaUtil.getEncoderCodecInfo(AAC_TYPE); if (info != null) { try { mCodec = MediaCodec.createByCodecName(info.getName()); mediaFormat = MediaFormat.createAudioFormat(AAC_TYPE, sampleRate, channelCount); mediaFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, aacLevel); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate); mediaFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, bufferSize); mediaFormat.setInteger(MediaFormat.KEY_PCM_ENCODING, AudioFormat.ENCODING_PCM_16BIT); mCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); } catch (IOException e) { e.printStackTrace(); if (mCodec != null) { mCodec.release(); mCodec = null; } } } } // ������ AAC ��������������������������� private void encodeAudioDataToFile() { Log.i(TAG, "encodeAudioDataToFile start"); FileOutputStream out; try { out = new FileOutputStream(audioFile); } catch (FileNotFoundException e) { e.printStackTrace(); out = null; } if (out != null) { try { MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); boolean isEncodeEnd = false; while (!isEncodeEnd) { int inputBufferId = mCodec.dequeueInputBuffer(TIME_OUT); if (inputBufferId >= 0) { BufferPool.AudioData audioData = mBufferPool.pollDataBuffer(TIME_OUT, TimeUnit.MILLISECONDS); if (audioData != null) { ByteBuffer inputBuffer = mCodec.getInputBuffer(inputBufferId); byte[] data = audioData.data; inputBuffer.put(data, 0, audioData.readSize); mCodec.queueInputBuffer(inputBufferId, 0, audioData.readSize, 0, 0); mBufferPool.deque(audioData); } else if (audioData == null && isRecording) { mCodec.queueInputBuffer(inputBufferId, 0, 0, 0, 0); } else { mCodec.queueInputBuffer(inputBufferId, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); } } int outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, TIME_OUT); if (outputBufferId >= 0) { ByteBuffer outputBuffer = mCodec.getOutputBuffer(outputBufferId); if (bufferInfo.flags == MediaCodec.BUFFER_FLAG_END_OF_STREAM) { Log.i(TAG, "BUFFER_FLAG_END_OF_STREAM"); isEncodeEnd = true; } else { if (outputBuffer != null && bufferInfo.size > 0) { int len = bufferInfo.size; outputBuffer.get(aacData, 0, len); AacUtil.setADTSPacketLen(channelCount, aacHeader, len + AAC_HEADER_SIZE); totalSize += len; out.write(aacHeader); out.write(aacData, 0, len); } } mCodec.releaseOutputBuffer(outputBufferId, false); } else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { mediaFormat = mCodec.getOutputFormat(); } } } catch (IOException | InterruptedException e) { e.printStackTrace(); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } mBufferPool.clear(); mBufferPool = null; mCodec.stop(); mCodec.release(); mCodec = null; } }}
3. MediaCodec ������������������������
��������� MediaCodec ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
������������������
MediaCodec codec = MediaCodec.createByCodecName(name);MediaFormat mOutputFormat;// ������������������������������ MediaCodeccodec.setCallback(new MediaCodec.Callback() { @Override void onInputBufferAvailable(MediaCodec mc, int inputBufferId) { ByteBuffer inputBuffer = mc.getInputBuffer(inputBufferId); // ��������������������������� mc.queueInputBuffer(inputBufferId, 0, dataLength, 0, 0); } @Override void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, int.MustSeek) { ByteBuffer outputBuffer = mc.getOutputBuffer(outputBufferId); // ������������������ if (outputBuffer != null) { mOutputData = new byte[outputBuffer.remaining()]; outputBuffer.get(mOutputData); } mc.releaseOutputBuffer(outputBufferId, false); } @Override void onOutputFormatChanged(MediaCodec mc, MediaFormat format) { mOutputFormat = format; } @Override void onError(MediaCodec mc, int what, int extra) { // ������������������ }});// ������ MediaCodec codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); mOutputFormat = codec.getOutputFormat(); codec.start();// ������������������������������������ codec.stop(); codec.release(); codec = null;
������������������
MediaCodec codec = MediaCodec.createByCodecName(name);MediaFormat outputFormat = MediaFormat.createAudioFormat(AAC_TYPE, sampleRate, channelCount);codec.configure(outputFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);codec.start();while (true) { int inputBufferId = codec.dequeueInputBuffer(timeoutUs); if (inputBufferId >= 0) { ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId); // ��������������������������� codec.queueInputBuffer(inputBufferId, 0, dataLength, 0, 0); } int outputBufferId = codec.dequeueOutputBuffer(bufferInfo, timeoutUs); if (outputBufferId >= 0) { ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId); if (outputBuffer != null) { int len = bufferInfo.size; // ������������������ outputBuffer.get(aacData, 0, len); // ������������ out.write(aacHeader); out.write(aacData, 0, len); } codec.releaseOutputBuffer(outputBufferId, false); } else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { outputFormat = codec.getOutputFormat(); } else if (outputBufferId == MediaCodec.INFO p��s��) { // ������������������ }} codec.stop();codec.release();codec = null;
4. AAC ���������������������
������������������������������������������������������������������������ PCM ������������������������
���������������������������������������������������������������������������������������������������������������������������������������
��������������������������������������������������������� BUFFER_FLAG_END_OF_STREAM ������������������������������������������������������
���������������������������������������������������������������������������������������������
��������������������������������������������������� Android ������������������������ AAC ������������������������
发表评论
最新留言
关于作者
