其他分享
首页 > 其他分享> > android – MediaExtractor与wav文件一起使用时抛出IllegalArgumentException

android – MediaExtractor与wav文件一起使用时抛出IllegalArgumentException

作者:互联网

我正在使用Android MediaExtractor,如下所示:

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编码器.目标是将wave文件转换为aac.当然,上面的代码是缩写的,但我将错误跟踪到最后一行.

它也只在将MediaExtractor与wav文件一起使用时才会出现.例如,我使用.m4a代替,一切正常.

MediaExtractor的文档说:

MediaExtractor facilitates extraction of demuxed, typically encoded, media data from a data source.

“通常编码”并不排除未编码的PCM音频….对吗?任何人之前尝试过此或知道另一种稳定(!)方式:

>从wav中提取音频样本(不包括44byte或46byte标题)?
>在Android上将wav文件转换为aac?

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中添加).

解决方法:

我无法弄清楚“if”或“为什么不”MediaExtractor似乎无法从简单的wav文件中读取数据,因此我选择了不同的方法.由于WAV文件确实不需要解码,我现在使用一个简单的FileInputStream并跳过44字节的头.

我在这个要点中发表了一份工作样本:
https://gist.github.com/muetzenflo/3e83975aba6abe63413abd98bb33c401

经过近一周的研究,尝试和错误,这段代码似乎很少见.我记录了几乎每一行,并希望我能帮助那些在Android上与MediaCodec类斗争的人.

标签:android,audio,wav,mediacodec,mediaextractor
来源: https://codeday.me/bug/20190608/1199910.html