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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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由配置为AAC编码器的MediaCodec提供。目标是将波形文件转换为aac。当然,以上代码是缩写,但我将错误跟踪到了最后一行。

[仅当将MediaExtractor与wav文件一起使用时,也会发生。例如,我改用.m4a,一切正常。

MediaExtractor的文档说:

MediaExtractor有助于从数据源提取已解复用的,通常经过编码的媒体数据。

“通常已加密”不排除未编码的PCM音频。...对吗?任何人都曾尝试过此方法,或者知道另一种稳定的(!)方式:

  • 从wav中提取音频样本(不包括44byte或46byte标头)?
  • 将wav文件转换为Android上的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中添加)。

答案

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

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

经过将近一个星期的研究,反复尝试,这段代码似乎很少见。我记录了几乎每一行,并希望我能帮助其他在Android上使用MediaCodec类挣扎的人。

另一答案

在调用decoder.configure(format, ...)之前,我建议先调用format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 65536);,这将使解码器使用更大的缓冲区。这应该可以解决问题。如果没有,请尝试增加缓冲区大小。

以上是关于[MediaExtractor与wav文件一起使用时抛出IllegalArgumentException的主要内容,如果未能解决你的问题,请参考以下文章

Android媒体解码MediaCodec MediaExtractor学习

如何以编程方式将 2 个或多个 .WAV 文件连接在一起?

vs2008中vb.net怎么把声音文件一起打包

如何在没有 MediaExtractor 的情况下为 H264 使用 MediaCodec

音视频开发系列——全面了解Android MediaExtractor

如何使用 Alamofire.upload 函数上传带有一些参数的图片或 wav 文件