Android 多媒体——MediaCodec编码AAC
发布日期:2021-05-10 11:31:03 浏览次数:19 分类:精选文章

本文共 10127 字,大约阅读时间需要 33 分钟。

MediaCodec ������ AAC ���������������

1. MediaCodec ������

MediaCodec ������ Android ��������������������������������������������������������������������������������������������������������� MediaExtractor���MediaSync���MediaMuxer���MediaCrypto���MediaDrm ������������������������MediaCodec ���������������������������������������������������������������������������������������

MediaCodec ���������

������ MediaCodec encoding AAC ������������������������������������������������������������

  • ������������������������������ dequeueInputBuffer ������������������������������������������
  • ��������������������������������� PCM ������������������������������
  • ������������������������������������������������ queueInputBuffer ��������������� MediaCodec���
  • ���������������������������������������������������������������������������������������������������
  • ������������������������������ dequeueOutputBuffer ������������������������������
  • ������������������������������������������������������������������������������������������
  • ������������������������������������������������������ 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;
    // ������������������������������ MediaCodec
    codec.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 ������������������������

    上一篇:Android MultiMedia框架——OMX服务启动
    下一篇:Android 音频源码分析——aduio_policy_configuration.xml

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月12日 15时30分28秒