Медиа-кодек Android AAC Decoder (данные от Gstreamer)

Я хочу транслировать аудио с моего Raspberry с G-Streamer на мой телефон Android. В Gstreamer я использую следующий конвейер: gst-launch-1.0 audiotestsrc! Фаак! "audio/mpeg, mpegversion=4"! Мультиплексор. mpegtsmux name = mux! udpsink host = 224.0.0.1 port = 8001

faac кодирует аудио в AAC LC ( https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plugins/html/gst-plugins-bad-plugins-faac.html)

и mpegtsmux создает поток MPEG-TS ( https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plugins/html/gst-plugins-bad-plugins-mpegtsmux.html).

Я пытался сделать приложение для Android с Android Studio самостоятельно. Я получаю Данные с помощью Multicastsocket. Затем я попытался реализовать AAC-декодер с медиа-кодеком и медиа-экстрактором. Метод extractor.setDataSource не работает напрямую с сокетами, поэтому я записываю данные в файл и позволяю экстрактору получать свои данные из файла и передавать их в MediaCodec для создания декодера.

Кажется, что экстрактор понимает, что это AAC, но что-то не так с декодером. Это важная часть кода:

MediaExtractor extractor = new MediaExtractor();
    Uri path = Uri.fromFile(file);

    extractor.setDataSource(path.toString());

format = extractor.getTrackFormat(0); 
        String mime = format.getString(MediaFormat.KEY_MIME); 
        decoder = MediaCodec.createDecoderByType(mime); 
        decoder.configure(format, null, null, 0); 


        while (!stopTrack) { 


            multicastSocket.receive(packet); 

            decoder.start(); 
            data = packet.getData(); 

            inputBuffers = decoder.getInputBuffers(); 
            outputBuffers = decoder.getOutputBuffers(); 
            inputBufferIndex = decoder.dequeueInputBuffer(-1); 

            if (inputBufferIndex >= 0) 
            { 
                inputBuffer = inputBuffers[inputBufferIndex]; 
                inputBuffer.clear(); 

                inputBuffer.put(data); 

                decoder.queueInputBuffer(inputBufferIndex, 0, data.length, 0, 0); 
            } 

            bufferInfo = new MediaCodec.BufferInfo(); 
            outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 0); 

            while (outputBufferIndex >= 0) 
            { 
                outputBuffer = outputBuffers[outputBufferIndex]; 

                outputBuffer.position(bufferInfo.offset); 
                outputBuffer.limit(bufferInfo.offset + bufferInfo.size); 

                outData = new byte[bufferInfo.size]; 
                outputBuffer.get(outData); 

                //  Log.d("AudioDecoder", outData.length + " bytes decoded"); 

               track.write(outData, 0, outData.length); 

                decoder.releaseOutputBuffer(outputBufferIndex, false); 
                outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 0); 

            } 

Это все сообщения, которые я получаю в logcat:

D/ExtendedUtils: Try creating ExtendedExtractor 
E/MM_OSAL: FileSource::FileSource 
E/MM_OSAL: FileSource::FileSource m_bEveryThingOK 1 
E/MM_OSAL: MM_File_Create File Name /data/mmosal_logmask.cfg , Mode 0 
E/MM_OSAL: MM_File_Create failed .Efs Error No -1 , File Name      /data/mmosal_logmask.cfg , Mode 0 
E/MM_OSAL: Open or read fail on /data/mmosal_logmask.cfg. Possible permission denied issue. Looking for /data/misc/media/mmosal_logmask.cfg 
E/MM_OSAL: MM_File_Create File Name /data/misc/media/mmosal_logmask.cfg , Mode 0  
E/MM_OSAL: MM_File_Create failed .Efs Error No -1 , File Name /data/misc/media/mmosal_logmask.cfg , Mode 0 
E/MMParserExtractor:  FileSourceWrapper::New returned NULL 
D/ExtendedUtils: default extractor is NULL, return extended extractor 
E/MM_OSAL: FileSource::FileSource 
E/MM_OSAL: FileSource::FileSource m_bEveryThingOK 1 
E/MM_OSAL: MM_File_Create File Name /data/mmosal_logmask.cfg , Mode 0 
E/MM_OSAL: MM_File_Create failed .Efs Error No -1 , File Name /data/mmosal_logmask.cfg , Mode 0 
E/MM_OSAL: Open or read fail on /data/mmosal_logmask.cfg. Possible permission denied issue. Looking for /data/misc/media/mmosal_logmask.cfg 
E/MM_OSAL: MM_File_Create File Name /data/misc/media/mmosal_logmask.cfg , Mode 0 
E/MM_OSAL: MM_File_Create failed .Efs Error No -1 , File Name /data/misc/media/mmosal_logmask.cfg , Mode 0 
E/MM_OSAL: parseTransportStreamPacket isPESPacket failed 18954 
E/MM_OSAL: parseTransportStreamPacket isPESPacket failed 18783 
E/MM_OSAL: parseTransportStreamPacket isPESPacket failed 18954 
E/MM_OSAL: parseTransportStreamPacket isPESPacket failed 18783 
I/OMXClient: Using client-side OMX mux. 
E/OMXMaster: A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one. 
D/MediaCodec: MediaCodec[kWhatConfigure]: video-output-protection: 00000000, audio-output-protection: 00000000 
E/Format:: audio/mp4a-latm 
W/SoftAAC2: aacDecoder_DecodeFrame decoderErr = 0x4004 
W/SoftAAC2: AAC decoder returned error 0x4004, substituting silence 
I/SoftAAC2: Reconfiguring decoder: 0->44100 Hz, 0->0 channels 

Как я уже сказал, я записал некоторые аудиоданные в файл, откуда экстрактор получает информацию. Этот файл можно воспроизвести! Даже с нормальным приложением Android Music. Так что я думаю, что часть получения данных работает хорошо. Что-то должно быть не так с экстрактором или декодером, возможно, декодером, потому что экстрактор понимает, что формат AAC. Я также загрузил тестовый файл AAC, но те же самые проблемы и сообщения об ошибках.

Я надеюсь, что кто-то может помочь мне! Спасибо за любую помощь!

0 ответов

Другие вопросы по тегам