Как кодировать в AAC с помощью MediaCodec в Android?

Я хочу преобразовать файл из .mp3 в AAC и ссылаюсь на исходный код файла Spydroid APP.

Он преобразует аудиоданные из Microphone audio source в AAC.

Я пытаюсь изменить код и изменить источник звука с Microphone audio source на local mp3 file.

Но я не знаю, как протолкнуть необработанный звук в декодер...

Кто-нибудь может мне помочь и дать мне некоторое предложение?

Код кодирования выглядит следующим образом:

protected void encodeWithMediaCodec() throws IOException {

        final int bufferSize = AudioRecord.getMinBufferSize(mQuality.samplingRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT)*2;

        ((AACLATMPacketizer)mPacketizer).setSamplingRate(mQuality.samplingRate);

        //The music file in my phone , and I want to push it to the 
        long file_size = 0;
        string path = "/storage/sdcard1/music/test.mp3"
        File audio = new File(path );

        mMediaCodec = MediaCodec.createEncoderByType("audio/mp4a-latm");
        MediaFormat format = new MediaFormat();
        format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
        format.setInteger(MediaFormat.KEY_BIT_RATE, mQuality.bitRate);
        format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
        format.setInteger(MediaFormat.KEY_SAMPLE_RATE, mQuality.samplingRate);
        format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
        format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, mBuffer_Size);
        mMediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
        mMediaCodec.start();

        final MediaCodecInputStream inputStream = new MediaCodecInputStream(mMediaCodec);
        final ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();

        mThread = new Thread(new Runnable() {
            @Override
            public void run() {
                int len = 0, bufferIndex = 0;
                try {
                    while (!Thread.interrupted()) {
                        bufferIndex = mMediaCodec.dequeueInputBuffer(10000);
                        if (bufferIndex>=0) {
                            inputBuffers[bufferIndex].clear();


                            len = audio.length();
                            if (len ==  AudioRecord.ERROR_INVALID_OPERATION || len == AudioRecord.ERROR_BAD_VALUE) {
                                Log.e(TAG,"An error occured with the AudioRecord API !");
                            } else {
                                Log.v(TAG,"Pushing raw audio to the decoder: len="+len+" bs: "+inputBuffers[bufferIndex].capacity());
                                mMediaCodec.queueInputBuffer(bufferIndex, 0, len, System.nanoTime()/1000, 0);
                            }
                        }
                    }
                } catch (RuntimeException e) {
                    e.printStackTrace();
                }
            }
        });

        mThread.start();

        // The packetizer encapsulates this stream in an RTP stream and send it over the network
        mPacketizer.setDestination(mDestination, mRtpPort, mRtcpPort);
        mPacketizer.setInputStream(inputStream);
        mPacketizer.start();

        mStreaming = true;

    }

Он имеет журнал ошибок, подобный следующему:

V/AACStream(25015): Pushing raw audio to the decoder: len=11952883 bs: 4096
W/System.err(25015): java.lang.IllegalStateException
W/System.err(25015):    at android.media.MediaCodec.queueInputBuffer(Native Method)
W/System.err(25015):    at net.majorkernelpanic.streaming.audio.AACStream$1.run(AACStream.java:258)
W/System.err(25015):    at java.lang.Thread.run(Thread.java:856)
W/InputMethodManagerService(  574): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@42afeb98 attribute=null

И ошибка кода находится в

mMediaCodec.queueInputBuffer(bufferIndex, 0, len, System.nanoTime()/1000, 0);

Я думаю, что ошибка в len , но я не знаю, как это исправить...

И похоже не ставит музыкальный файл в кодировщик... И у меня два вопроса

Question 1:

Как отправить аудиофайл на MediaCodec?

Я что-то пропустил в коде?

Question 2:

Как убедиться, что данные были закодированы в AAC ??


person Martin    schedule 19.03.2014    source источник
comment
На первый взгляд, в вашем коде есть несколько неправильных/отсутствующих вещей: (1) вы не можете отправлять данные mp3 в кодировщик aac. Это должны быть данные PCM. Другими словами, вам нужно сначала декодировать ваш mp3-файл, а затем перекодировать декодированные данные. (2) вы пытаетесь отправить весь файл в кодек сразу. Буфера для этого недостаточно. (3) кажется, что вы на самом деле ничего не читаете из своего mp3-файла, поэтому буфер фактически не содержит никаких аудиоданных.   -  person marcone    schedule 19.03.2014
comment
@marcone Спасибо за тебя, за Первое, что ты говоришь. Какой формат я должен декодировать для файла mp3 и какой формат мне следует перекодировать?   -  person Martin    schedule 20.03.2014
comment
@marcone Я хочу отправить потоковое аудио в реальном времени на другое устройство, могу ли я отправить mp3-файл напрямую на другое устройство без кодирования?   -  person Martin    schedule 20.03.2014
comment
@fadden Кажется, это не имеет значения ... Спасибо!   -  person Martin    schedule 20.03.2014