簡體   English   中英

Java輸出值隨時間的變化

[英]Java output values over time

我有一個音頻文件,正在將其轉換為字節數組,但是您無法分辨該字節值何時真正在歌曲中播放。 因此,我嘗試將其擴展到歌曲的長度。

因此,在播放歌曲時,它會輸出字節值。 這怎么可能?

到目前為止,這是我的代碼:

public class Main {

private static final String FILENAME = "assets/pf.wav";
private static double[] endResult = null;

public static void convert() throws IOException{
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(FILENAME));

    int read;
    byte[] buff = new byte[1024];
    while ((read = in.read(buff)) > 0)
    {
        out.write(buff, 0, read);
    }
    out.flush();
    byte[] audioBytes = out.toByteArray();
    endResult = calculateFFT(audioBytes);
}

public static double[] calculateFFT(byte[] signal)
{           
    final int mNumberOfFFTPoints =1024;
    double mMaxFFTSample;
    double temp;
    Complex[] y;
    Complex[] complexSignal = new Complex[mNumberOfFFTPoints];
    double[] absSignal = new double[mNumberOfFFTPoints/2];

    for(int i = 0; i < mNumberOfFFTPoints; i++){
        temp = (double)((signal[2*i] & 0xFF) | (signal[2*i+1] << 8)) / 32768.0F;
        complexSignal[i] = new Complex(temp,0.0);
    }

    y = FFT.fft(complexSignal);

    mMaxFFTSample = 0.0;
    int mPeakPos = 0;
    for(int i = 0; i < (mNumberOfFFTPoints/2); i++)
    {
         absSignal[i] = Math.sqrt(Math.pow(y[i].re(), 2) + Math.pow(y[i].im(), 2));
         if(absSignal[i] > mMaxFFTSample)
         {
             mMaxFFTSample = absSignal[i];
             mPeakPos = i;
         } 
    }

    return absSignal;

}

public static void main(String[] args) throws UnsupportedAudioFileException, IOException     {
    File file = new File(FILENAME);
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
    AudioFormat format = audioInputStream.getFormat();
    long frames = audioInputStream.getFrameLength();
    final double durationInSeconds = (frames+0.0) / format.getFrameRate();  
    try {
        convert();
        for(int i = 0; i < endResult.length; i++) {
            System.out.println(endResult[i]);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}


}

我如何隨時間而不是立即打印出字節數組( endResult[i] )的值?

每當您打印出一個值時,請執行以下操作:

Thread.sleep(100);

等待100毫秒(0.1秒)后再打印下一個值。 這當然是可調的。

暫無
暫無

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

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