我想分析一个音频文件(特别是mp3),用户可以选择该文件并确定播放的音符,播放时间和频率。
我的计算机已经有了一些工作代码,但我希望能够在手机上使用它。
然而,为了做到这一点,我需要访问音频文件的字节。在我的电脑上,我可以打开一个流并使用AudioFormat对其进行解码,然后逐帧读取()字节。
查看Android开发者论坛我只能找到播放文件的类和示例(无法访问字节)或录制到文件(我想从文件中读取)。
我非常有信心可以设置一个文件选择器,但是一旦我拥有了Uri,我就不知道如何获取流或字节。
非常感谢任何帮助:)
编辑:这可能是一个类似的解决方案吗? Android - Read a File 我不知道我是否可以通过这种方式解码音频文件,或者Android API会出现任何问题...
答案 0 :(得分:0)
所以我用以下方式解决了它:
使用
获取InputStreamfinal InputStream inputStream = getContentResolver().openInputStream(selectedUri);
然后在此函数中传递它并使用JLayer中的类对其进行解码:
private synchronized void decode(InputStream in)
throws BitstreamException, DecoderException {
ArrayList<Short> output = new ArrayList<>(1024);
Bitstream bitstream = new Bitstream(in);
Decoder decoder = new Decoder();
float total_ms = 0f;
float nextNotify = -1f;
boolean done = false;
while (! done) {
Header frameHeader = bitstream.readFrame();
if (total_ms > nextNotify) {
mListener.OnDecodeUpdate((int) total_ms);
nextNotify += 500f;
}
if (frameHeader == null) {
done = true;
} else {
total_ms += frameHeader.ms_per_frame();
SampleBuffer buffer = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream); // CPU intense
if (buffer.getSampleFrequency() != 44100 || buffer.getChannelCount() != 2) {
throw new DecoderException("mono or non-44100 MP3 not supported", null);
}
short[] pcm = buffer.getBuffer();
for (int i = 0; i < pcm.length-1; i += 2) {
short l = pcm[i];
short r = pcm[i+1];
short mono = (short) ((l + r) / 2f);
output.add(mono); // RAM intense
}
}
bitstream.closeFrame();
}
bitstream.close();
mListener.OnDecodeComplete(output);
}
完整项目(如果您想查看详情)可以在这里找到: https://github.com/S7uXN37/MusicInterpreterStudio/