我正在使用Android MediaExtractor,代码如下:
输入缓冲区由配置为AAC编码器的MediaCodec提供。目标是将波形文件转换为AAC格式。当然,上面的代码是缩写的,但我把错误追踪到了最后一行。它也仅在使用MediaExtractor处理wav文件时发生。例如,我使用.m4a代替wav文件,一切都正常。MediaExtractor的文档说:“MediaExtractor便于从数据源中提取解复用的媒体数据,通常是已编码的。”“通常已编码”不排除未编码的PCM音频,对吧?有人尝试过这个方法或知道另一个稳定的方法来:从wav文件中提取音频样本(不包括44字节或46字节的头)?在Android上将wav文件转换为AAC吗?更新:下面是logcat:
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提供。目标是将波形文件转换为AAC格式。当然,上面的代码是缩写的,但我把错误追踪到了最后一行。它也仅在使用MediaExtractor处理wav文件时发生。例如,我使用.m4a代替wav文件,一切都正常。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中添加的)。
logcat
日志吗?IllegalArgumentException
可能是由于多种情况引起的。如果您有logcat
,我们可以更容易地定位问题并提出解决方案。另外,请确认一下文件是否存在于path/to/my/wav/file.wav
路径下。还有,请您指明您正在使用的Android版本是哪个? - Ganeshcom.android.audiosandbox.convert.MediaEncoder2.encode
中可以看出,正在使用自定义编码器。为了隔离这个问题,请从media_codecs.xml
中删除此encoder
并尝试使用__default__软件编码器,即MediaCodec
,如此示例所示:http://androidxref.com/4.1.2/xref/frameworks/av/cmds/stagefright/SimplePlayer.cpp#316 - GaneshMediaExtractor
的本地实现是由NuMediaExtractor
实现的。在记录中引用的方法中,唯一的错误退出可能是由于-ENOMEM
,如此处所示:http://androidxref.com/4.1.1/xref/frameworks/av/media/libstagefright/NuMediaExtractor.cpp#402。你能否使用较大的缓冲区重试`MediaExtractor`并检查是否正常工作?如果这样可以解决问题,我将把它发布为答案。 - Ganesh