2016-12-07 33 views
1

Я пытаюсь декодировать файлы AAC в моем приложении и инициализировать объект MediaFormat, используемый для инициализации объекта MediaCodec. Это код для настройки переменные для MediaFormat объектаMediaFormat.getByteBuffer ("csd-0"), возвращающий нуль на некоторых устройствах

MediaExtractor mediaExtractor = new MediaExtractor(); 
     try { 
      mediaExtractor.setDataSource(audioFilePath); 
     } catch (IOException e) { 
      return false; 
     } 
     Log.d(TAG, "Number of tracks in the file are:" + mediaExtractor.getTrackCount()); 

     MediaFormat mediaFormat = mediaExtractor.getTrackFormat(0); 

     Log.d(TAG, "mediaFormat:" + mediaFormat.toString()); 

     mSampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE); 
     Log.d(TAG, "mSampleRate: " + mSampleRate); 


     mChannels = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT); 

     Log.d(TAG, "mChannels number of channels: " + mChannels); 

     // Reading the duration from the file and converting from micro seconds to milliseconds. 
     mDuration = (int) (mediaFormat.getLong(MediaFormat.KEY_DURATION)/1000); 

     Log.d(TAG, "duration: " + mDuration); 

     // Getting the csd-0 info from the file .. 
     mCSDBuffer = mediaFormat.getByteBuffer("csd-0"); 

проблема я столкнулся в том, что заявление mCSDBuffer = mediaFormat.getByteBuffer("csd-0") выбирает меня null для одного файла на некоторых устройствах. Приложение находится в производстве, и я вижу эту ошибку на процессорах armabi-v7a/armabi с уровнем API android API 17, 18 и 19, и большинство этих ошибок на устройствах Samsung. Любое направление на это?

ответ

2

Если буфер csd-0 имеет значение NULL, тогда я бы ожидал, что он будет правильно декодироваться при передаче в MediaCodec. Означает ли это, если вы просто не хотите указывать данные csd-0 в качестве входных данных для MediaCodec, если он равен нулю? В общем, вы должны иметь возможность декодировать выход MediaExtractor, если вы просто подключите его прямо к MediaCodec.

Фактический формат вывода данных MediaExtractor не очень строго определен, хотя на практике известно, что некоторые производители (в основном Samsung) меняют это так, что обрабатывает только их собственный декодер. См. https://code.google.com/p/android/issues/detail?id=74356 для другого случая того же.

В идеале, тесты CTS для Android будут более строгими, чтобы убедиться, что MediaExtractor ведет себя последовательно, позволяя использовать его в более общем контексте или использовать другой декодер, чем MediaCodec. (Например, при текущих проблемах Samsung вы не можете использовать MediaExtractor на одном устройстве, отправлять извлеченные данные по сети на другое устройство и декодировать его там.)

+0

У меня также есть пользовательская функция, с помощью которой я генерирую буфер «csd-0», как указано в http://stackoverflow.com/a/32154154/2606411. Могу ли я использовать это, чтобы вручную установить информацию? – Swapnil

+0

Возможно, вы сможете это использовать. Но если вы это сделаете, вероятно, вы также должны лишить заголовки ADTS из фактических аудиопакетов. IMO, если MediaExtractor решает возвращать данные в формате ADTS (т. Е. Нет заголовков 'csd-0' и ADTS в пакетах), то MediaCodec должен иметь возможность обрабатывать его, поэтому я не думаю, что вам нужно будет делать какое-либо редактирование на все. – mstorsjo

+0

Мы сами закодировали файлы, которые мы используем, и мы установили заголовки ADTS для всех из них, поэтому я предполагаю, что имеет смысл установить этот заголовок вручную. – Swapnil