Я использую 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).
Можете ли вы поделиться точными журналами logcat? 'IllegalArgumentException' может возникнуть из-за нескольких сценариев. Если у вас есть 'logcat', было бы легче изолировать и предложить решение. В связи с этим вы подтвердили, что файл существует здесь 'path/to/my/wav/file.wav' ?. Кроме того, не могли бы вы указать, в какой версии Android вы работаете? – Ganesh
Из ваших журналов '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
Ну, «пользовательский кодер» - это класс, над которым я работаю. Я получил его сейчас, но не с MediaExtractor. Я отправлю суть в качестве ответа. Если у вас есть больше информации об использовании MediaExtractor с wav-файлами, я бы с радостью его услышал. Благодаря! – muetzenflo