簡體   English   中英

Android:從文件uri讀取音頻數據

[英]Android: Read audio data from file uri

我想分析一個音頻文件(尤其是MP3),用戶可以選擇該音頻文件並確定播放哪些音符,何時播放以及以什么頻率播放。

我已經為我的計算機准備了一些工作代碼,但是我也希望能夠在手機上使用它。

為了做到這一點,我需要訪問音頻文件的字節。 在我的PC上,我可以打開一個流並使用AudioFormat對其進行解碼,然后逐幀讀取()個字節。

在Android開發者論壇上,我只能找到播放文件(無法訪問字節)或記錄到文件(我想從文件中讀取)的類和示例。

我非常有信心可以設置文件選擇器,但是一旦有了該文件選擇器,我就不知道如何獲取流或字節。

任何幫助將非常感激 :)

編輯:這是可能的類似解決方案嗎? Android-讀取文件,我不知道我是否可以那樣解碼音頻文件,或者Android API是否有任何問題...

因此,我通過以下方式解決了該問題:

使用以下方法獲取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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM