Android:从文件uri读取音频数据

时间:2016-06-16 16:10:53

标签: android audio inputstream

我想分析一个音频文件(特别是mp3),用户可以选择该文件并确定播放的音符,播放时间和频率。

我的计算机已经有了一些工作代码,但我希望能够在手机上使用它。

然而,为了做到这一点,我需要访问音频文件的字节。在我的电脑上,我可以打开一个流并使用AudioFormat对其进行解码,然后逐帧读取()字节。

查看Android开发者论坛我只能找到播放文件的类和示例(无法访问字节)或录制到文件(我想从文件中读取)。

我非常有信心可以设置一个文件选择器,但是一旦我拥有了Uri,我就不知道如何获取流或字节。

非常感谢任何帮助:)

编辑:这可能是一个类似的解决方案吗? Android - Read a File 我不知道我是否可以通过这种方式解码音频文件,或者Android API会出现任何问题...

1 个答案:

答案 0 :(得分:0)

所以我用以下方式解决了它:

使用

获取InputStream
final 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/