[英]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.