当前位置: 首页 > 知识库问答 >
问题:

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

艾骏喆
2023-03-14

我使用的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);

输入缓冲区由配置为AAC编码器的MediaCodec提供。目标是将wave文件转换为aac。当然,上面的代码是缩写的,但我一直跟踪到最后一行。

它也仅在将MediaExtractor与wav文件一起使用时发生。例如,我使用了一个。m4a,一切正常。

MediaExtractor的文档显示:

MediaExtractor有助于从数据源中提取经过解复用(通常是编码)的媒体数据。

“通常加密”不排除未编码PCM音频。。。。正当以前有人试过这个,或者认识另一个马厩(!)方法:

  • 从wav中提取音频样本(不包括44字节或46字节头)
  • 在Android上将wav文件转换为aac

使现代化

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

共有2个答案

勾海超
2023-03-14

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

何甫
2023-03-14

我无法弄清楚“如果”或“为什么不”MediaExtractor似乎无法从简单的wav文件中读取数据,所以我选择了不同的方法。由于WAV文件并不真正需要解码,我现在使用一个简单的FileInputStream并跳过44字节的标头。

我在这篇文章中发表了一个工作样本:https://gist.github.com/muetzenflo/3e83975aba6abe63413abd98bb33c401

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

 类似资料:
  • 问题内容: 我正在为接下来的2个月内的OCPJP 8考试做准备,目前我受到了我的关注,因为我不明白为什么 这显然要编译OK!但是当您运行它时,您会看到这样的异常 我在这里需要一些帮助,以了解为什么asList方法不能与removeIf一起使用?我假设它将返回一个实现removeIf方法的ArrayList实例! 任何答案将不胜感激。 干杯! 问题答案: 生成一个列表,从该列表中无法删除元素,因此引

  • 基本上,我想将格式为“hh:mm”的DateTimeFormatter应用于我从“zonedDateTime”获得的值。toLocalTime()'对象,并将其存储为LocalTime对象,这样我就可以获得像“08:00”这样的值。下面的代码显示了我如何获取特定时区的当前时间,我试图在格式化时将其转换为名为“currentTime”的LocalTime: 现在由于某种未知的原因,我从上面的最后一个

  • 我最近开始使用JMockit,对TDD和mocking非常陌生。我喜欢使用代码覆盖率来确保我已经测试了给定类/方法的所有行。 我在尝试JMockit(Delegate()功能)和代码覆盖率时遇到了以下错误。我包括通过和不通过的考试。 我不确定我是否做错了什么? 我想知道是否有其他人遇到过此问题,是否有任何解决方案或修复可用? 我甚至不确定这是JMockit问题还是EclEmma问题。谢谢 我的设置

  • 我正在尝试用文件键上传一个HEIC文件。我应该指定哪种文件类型? 现在我有这个: 我在文件里找不到任何关于这个的东西,我的实验也不起作用。 下面是我试图上传的测试文件: https://github.com/tigranbs/test-heic-images/raw/master/image1.heic

  • 这段代码实际上会崩溃Jasmine/Karma的整个执行,即使在原始堆栈跟踪中也会导致错误。 我认为如果可观察抛出并且无法处理它应该在它所在的上下文中传播该错误。否则,我无法测试可观察是否抛出。 此(茉莉花)测试将产生以下错误: 未捕获错误:CatchSubscriber.selector (slideshow.directive.spec.ts:224) 上的新错误 catchSubscribe

  • 我的适配器 我的持有者 类myHolder(itemView:View):recyclerview.viewholder(itemView){} 第二个 提前致谢