从mp3流中提取音量和/或频率数据的Android应用程序

时间:2013-12-21 19:37:48

标签: android mp3 frequency-analysis

仍然是新手java开发人员,我需要构建一个

的Android应用程序

1从提供的URL流式传输单个mp3,然后

2从mp3流中提取音量和/或声音频率数据

3从#2

中的数据驱动灯光秀

我有一个可能的解决方案#1,我正在研究#2,

任何人都可以在我应该关注的SDK中建议特定的类吗?

github或其他地方是否有任何现有的Android项目从我可能会检查和学习的流式mp3文件中提取频率和/或数据量?

3 个答案:

答案 0 :(得分:0)

Echo Nest(http://developer.echonest.com/)是分析MP3以提供音量,频率,节拍和其他数据的绝佳工具。

有一个适用于Android的java库。

答案 1 :(得分:0)

这是您项目的另一个好资源:http://therandomlab.blogspot.nl/2013/05/fft-audio-frequency-analysis-with.html

祝你好运

答案 2 :(得分:0)

您将希望公开读取的底层缓冲区,以便获得派生的卷级别...这可能意味着使用除“MediaPlayer”之外的其他API,这些API可能不会暴露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音量水平*观察   根据正弦波* min&amp; amp;和RMS的最后读数最大的是   wave *'myamt'字段中的'y轴'值是一个阈值上限   目前在实践中是delta(max-min)*的10%,a   pause必须有一系列相邻的RMS值和AVG LESS   比*一些配置值。 *暂停的TS一旦出现   接受,还有另一个最小值的时间应该通过   在寻找演讲中的另一个停顿之前。 *有用的提示 - 5   至10%的RMS值应增加“十分位数”。 * 除此以外,   在雷达上没有足够的低容量事件到ID暂停   讲话。

为了公开缓冲区而不是'MediaPlayer'api,您可能需要使用'AudioTrack'之类的东西来处理您的mp3。对于样本,我认为您可以在git

上访问此项目

RMS和处理程序解释here