我正在使用Android MediaExtractor:
Bundle bundle = Platform.getBundle("plugin id");
inputBuffer由MediaCodec提供,它被配置为AAC编码器。目标是将wave文件转换为aac。当然,上面的代码是缩写的,但我将错误跟踪到最后一行。
仅在将MediaExtractor与wav文件一起使用时才会出现此问题。例如,我使用的是.m4a而且一切正常。
MediaExtractor的文档说:
MediaExtractor有助于从数据源中提取解复用的,通常为编码的媒体数据。
“通常编码”并不排除非编码PCM音频....对吗?任何人之前都尝试过这种方法,或者知道另一种稳定的(!)方式:
更新
这是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中添加)。
答案 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);
,这将使解码器使用更大的缓冲区。
这应该可以解决问题。如果没有,请尝试增加缓冲区大小。