3

「audio/3gpp」のエンコーダーを作成しようとすると、アプリがクラッシュします。

MediaCodec を構成します...

    String mMime = "audio/3gpp";
    mMediaCodec = MediaCodec.createEncoderByType(mMime);
    MediaFormat mMediaFormat = MediaFormat.createAudioFormat(mMime, 44100, 1);
    mMediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 12000);
    mMediaFormat.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
    mMediaFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
    mMediaCodec.configure(mMediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    mMediaCodec.start();

そして、データをエンコードしようとしています...

private byte[] EncodeDataTo3gp(byte[] input)
{
    byte[] outData = null;

    try 
    {
        ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();

        ByteBuffer[] outputBuffers = mMediaCodec.getOutputBuffers();
        int inputBufferIndex = mMediaCodec.dequeueInputBuffer(-1);
        if (inputBufferIndex >= 0) 
        {
            ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
            inputBuffer.clear();
            inputBuffer.put(input);
            mMediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0);
        }

        MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
        int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
        while (outputBufferIndex >= 0) 
        {
            ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
            outData = new byte[bufferInfo.size];
            outputBuffer.get(outData);

            mMediaCodec.releaseOutputBuffer(outputBufferIndex, false);
            outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
        }
    } catch (Throwable t) {
        t.printStackTrace();
    }

    return outData;
}

しかし、この関数は例外をスローしています。いつ"inputBuffer.put(input);": java.nio.BufferOverflowException

4

3 に答える 3

4

サイズに応じてMediaFormat.KEY_MAX_INPUT_SIZEパラメーターを追加してみてください。の容量が増えます。mMediaFormatinputinputBuffers

于 2013-07-17T12:36:49.147 に答える
2

入力バッファの処理は問題ないように見えますclear()-位置と制限をリセットするために使用しています-したがって、提供している入力はバッファが保持できるよりも単純に大きいと想定しています。input.lengthより大きい場合はinputBuffer.limit()、より小さいチャンクで提供する必要があります。

出力バッファーの管理は少し奇妙に見えます。outDataループの反復ごとに再割り当てしているため、複数のバッファーを取得すると、最後のバッファー以外はすべて破棄されてしまいます。

入力と出力の両方で、負の戻り値を処理していません。特に、アレイINFO_*_BUFFERS_CHANGEDを再取得する必要があります。ByteBuffer

于 2013-07-10T00:23:01.933 に答える
1

inputBuffer.rewind();前に置いinputBuffer.put(input);て試してみてください

于 2013-07-05T14:00:12.090 に答える