MediaExtractor 在与 wav 文件一起使用时抛出 IllegalArgumentException
MediaExtractor throws IllegalArgumentException when used with wav file
我正在这样使用 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提供。目标是将 wave 文件转换为 aac。上面的代码当然是缩写了,但是我一直追踪到最后一行的错误。
它也仅在使用 MediaExtractor 处理 wav 文件时发生。例如,我改用了 .m4a,一切正常。
MediaExtractor 的文档说:
MediaExtractor facilitates extraction of demuxed, typically encoded, media data from a data source.
"typically encdoded" 不排除 un-encodec PCM 音频....对吗?任何人以前尝试过这个或知道另一种稳定(!)的方法:
- 从 wav 中提取音频样本(不包括 44byte 或 46byte header)?
- 在 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.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" 或 "why not" MediaExtractor 似乎无法从简单的 wav 文件中读取数据,所以我选择了不同的方法。由于 WAV 文件实际上不需要解码,我现在使用一个简单的 FileInputStream 并跳过 44 字节 header.
我在这个要点中发布了一个工作示例:
https://gist.github.com/muetzenflo/3e83975aba6abe63413abd98bb33c401
经过将近一周的研究,试错,这段代码似乎很少见。我记录了几乎每一行,希望我能帮助那些在 Android.
上与 MediaCodec class 斗争的其他人
在调用decoder.configure(format, ...)
之前,我建议调用format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 65536);
,它会让解码器使用更大的缓冲区。
这应该可以解决问题。如果不是,请尝试增加缓冲区大小。
我正在这样使用 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提供。目标是将 wave 文件转换为 aac。上面的代码当然是缩写了,但是我一直追踪到最后一行的错误。
它也仅在使用 MediaExtractor 处理 wav 文件时发生。例如,我改用了 .m4a,一切正常。
MediaExtractor 的文档说:
MediaExtractor facilitates extraction of demuxed, typically encoded, media data from a data source.
"typically encdoded" 不排除 un-encodec PCM 音频....对吗?任何人以前尝试过这个或知道另一种稳定(!)的方法:
- 从 wav 中提取音频样本(不包括 44byte 或 46byte header)?
- 在 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.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" 或 "why not" MediaExtractor 似乎无法从简单的 wav 文件中读取数据,所以我选择了不同的方法。由于 WAV 文件实际上不需要解码,我现在使用一个简单的 FileInputStream 并跳过 44 字节 header.
我在这个要点中发布了一个工作示例: https://gist.github.com/muetzenflo/3e83975aba6abe63413abd98bb33c401
经过将近一周的研究,试错,这段代码似乎很少见。我记录了几乎每一行,希望我能帮助那些在 Android.
上与 MediaCodec class 斗争的其他人在调用decoder.configure(format, ...)
之前,我建议调用format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 65536);
,它会让解码器使用更大的缓冲区。
这应该可以解决问题。如果不是,请尝试增加缓冲区大小。