2016-06-24 10 views
4

Я использую Android MediaExtractor так:MediaExtractor бросает IllegalArgumentException при использовании WAV файла

MediaExtractor extractor = new MediaExtractor(); 
extractor.setDataSource("path/to/my/wav/file.wav"); 
extractor.selectTrack(0); 

ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferIndex); 
int sampleSize = extractor.readSampleData(inputBuffer, 0); 

InputBuffer обеспечивается MediaCodec, который сконфигурирован как AAC Encoder. Цель состоит в том, чтобы преобразовать файл волны в aac. Вышеупомянутый код, конечно, сокращен, но я проследил ошибку до последней строки.

Это также происходит при использовании MediaExtractor с wav-файлом. Например, вместо этого я использовал .m4a, и все работало нормально.

Документация MediaExtractor говорит:

MediaExtractor облегчает извлечение, как правило, помещать демультиплексирование, закодированных мультимедийных данных из источника данных.

«типично encdoded» не исключает возможность кодирования без кодирования PCM .... правильно? Кто-то пробовал это раньше или знает еще один стабильный (!) Способ:

  • извлекает аудио-образцы из wav (исключая 44 байт или 46-байтовый заголовок)?
  • конвертировать wav-файл в aac на Android?

UPDATE

Вот LogCat:

W/System.err: java.lang.IllegalArgumentException 
W/System.err:  at android.media.MediaExtractor.readSampleData(Native Method) 
W/System.err:  at com.myproject.android.audiosandbox.convert.MediaEncoder2.encodeLollipopStyle(MediaEncoder2.java:247) 
W/System.err:  at com.myproject.android.audiosandbox.convert.MediaEncoder2.encodeSong(MediaEncoder2.java:119) 
W/System.err:  at com.myproject.android.audiosandbox.convert.MediaEncoder2.encode(MediaEncoder2.java:70) 
W/System.err:  at com.myproject.android.audiosandbox.fragments.AudioConvertFragment$1.onClick(AudioConvertFragment.java:40) 
W/System.err:  at android.view.View.performClick(View.java:4763) 
W/System.err:  at android.view.View$PerformClick.run(View.java:19821) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:135) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5272) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at java.lang.reflect.Method.invoke(Method.java:372) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 

Я использую API 16, поэтому MediaMuxer не вариант (был добавлен в API 18).

+0

Можете ли вы поделиться точными журналами logcat? 'IllegalArgumentException' может возникнуть из-за нескольких сценариев. Если у вас есть 'logcat', было бы легче изолировать и предложить решение. В связи с этим вы подтвердили, что файл существует здесь 'path/to/my/wav/file.wav' ?. Кроме того, не могли бы вы указать, в какой версии Android вы работаете? – Ganesh

+0

Из ваших журналов 'com.android.audiosandbox.convert.MediaEncoder2.encode', похоже, что используется пользовательский кодер. Чтобы изолировать эту проблему, вы можете удалить этот «encoder» из «media_codecs.xml» и попытаться использовать программный кодер __default__, т.е. «MediaCodec», как в этом примере: http://androidxref.com/4.1.2/xref/ frameworks/av/cmds/stagefright/SimplePlayer.cpp # 316 – Ganesh

+0

Ну, «пользовательский кодер» - это класс, над которым я работаю. Я получил его сейчас, но не с MediaExtractor. Я отправлю суть в качестве ответа. Если у вас есть больше информации об использовании MediaExtractor с wav-файлами, я бы с радостью его услышал. Благодаря! – muetzenflo

ответ

4

Я не мог понять, «если» или «почему нет», MediaExtractor, похоже, не может прочитать данные из простого wav-файла, поэтому я выбрал другой подход. Поскольку WAV-файл действительно не нужно декодировать, теперь я использую простой FileInputStream и пропускаю 44-байтовый заголовок.

я получил рабочий образец, опубликованную в этом суть: https://gist.github.com/muetzenflo/3e83975aba6abe63413abd98bb33c401

После почти одна неделя исследований, проб и ошибок, этот кусок кода, кажется, редко. Я документировал почти каждую строку и надеюсь, что смогу помочь другим, кто борется с классом MediaCodec на Android.

+0

Отлично работает! Спасибо за код. – fl0cke