2013-12-21 17 views
4

儘管如此新手Java開發人員,我需要建立一個Android應用程序,從所提供的URL從一個MP3流中提取體積和或頻率數據Android應用

1流的單個MP3和然後

2提取體積和或從MP3流聲音頻率數據

3驅動光顯示從數據中#2

我有一個可能的解決方案#1和很努力#2,

任何人都可以在SDK中看到特定的類,我應該看看嗎?

github上或其他地方是否有任何現有的Android項目從流式傳輸mp3文件中提取頻率和/或音量數據我可能會從中學習?

+0

對於MP3的頻率,你可以看到這個蘇答案:http://stackoverflow.com/a/5189581/ 1739882 –

+0

該問題需要澄清其「頻率」含義。 OP是否意味着編碼比特率或聲音頻率? – Stan

+0

我認爲第三個要求是音頻波形頻率,但我敢打賭,他們真正想要的是FFT分析。 –

回答

0

你將要暴露緩衝根本讀這樣你就可以得到的音量水平得到...這可能意味着使用一些其他的API比'MediaPlayer'可能不會暴露音量的RMS級別。

每次開啓MP3做了緩衝讀寫時間,您可以生成x軸,從卷y軸數據有以下:

while (mIsPlaying) { 
    double sum = 0; 
    int readSize = mRecorder.read(mBuffer, 0, mBuffer.length); 
    for (int i = 0; i < readSize; i++) { 
     output.writeShort(mBuffer[i]); 
     sum += mBuffer[i] * mBuffer[i]; 
    } 
// PrBar needs RMS as int 
//log base2 for the rms expression on the Volume from the mic 
    if (readSize > 0) { 
     mProgressBar.setProgress((int)Math.sqrt(sum/readSize)); 
     handleRMS((Math.log(Math.sqrt(sum/readSize))/Math.log(2))); 


    } 
} 

...

private void handleRMS(double rms){ 

    rmscnt++; 
    rmssum += rms; 
    if(rms > rmsmax)rmsmax=rms; 
    if(rms< rmsmin)rmsmin=rms; 
    double myamt=(rmsmax - rmsmin)/10 +rmsmin; 
    if (rms < myamt) decile++; 
    if(rmscnt % 5 ==0){ 
     if (rmssum/5 < myamt) {          
     if(Long.valueOf(System.currentTimeMillis()) 
      - tslist.get(tslist.size()-1) - segmenttime > 0){ 
      tslist.add(Long.valueOf(System.currentTimeMillis())); 
     }; 
    }; 
    rmssum = 0; 
} 
} 
* feature - select the TS corresponding to a 'pause' in the speech stream  * arriving from microphone  * ''pause' in algorythm and 

正弦波模式下的正常RMS音量*根據正弦波*觀察 RMS的最後讀數*分鐘波峯上的y軸'vals *'myamt'字段是一個閾值上限, 目前是delta(max - min)*的10%*實際上,一個 暫停必須有一系列相鄰的RMS價值與AVG LESS 比*某些配置值。 *一旦接受暫停的TS爲 ,則在查找語音中的另一個暫停之前,應該通過 還有另一個最小時間值。 *有幫助的提示 - 5 到10%的RMS值應增加「十分位」。 *否則, 在雷達上沒有足夠的LO音量事件發生 演講中的ID暫停。

爲了暴露緩衝區,而不是'MediaPlayer'API,您可能需要使用類似'AudioTrack'來處理您的MP3。對於樣品,我覺得你可以去這個項目上git

RMS和處理解釋here