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

时间:2016-06-24 08:41:24

标签: android audio wav mediacodec mediaextractor

我正在使用Android MediaExtractor:

Bundle bundle = Platform.getBundle("plugin id");

inputBuffer由MediaCodec提供,它被配置为AAC编码器。目标是将wave文件转换为aac。当然,上面的代码是缩写的,但我将错误跟踪到最后一行。

仅在将MediaExtractor与wav文件一起使用时才会出现此问题。例如,我使用的是.m4a而且一切正常。

MediaExtractor的文档说:

  

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

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

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

我使用的是API 16,因此MediaMuxer不是一个选项(在API 18中添加)。

2 个答案:

答案 0 :(得分:5)

我无法弄明白"如果"或"为什么不" MediaExtractor似乎无法从简单的wav文件中读取数据,因此我选择了不同的方法。由于WAV文件确实不需要解码,我现在使用一个简单的FileInputStream并跳过44字节的标题。

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

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

答案 1 :(得分:0)

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