测量Android中方法的运行时间

时间:2014-05-05 11:31:21

标签: android audio time

我有一种从智能手机的扬声器生成音频信号的方法,我将持续时间设置为1秒。我想知道播放的声音是否真的播放了一秒钟。 因为我创建了一个playSound()方法并使用getTimeInMillis()方法来测量时间。

结果从11毫秒变化到679毫秒。在我看来,它只测量方法的执行时间而不是整个运行时间(playSound()停止的时间)。

有没有办法在java中测量时间?

void genTone() throws IOException{

    double instfreq=0, numerator;

    for (int i=0;i<numSample; i++ )
    {
        numerator=(double)(i)/(double)numSample;
        instfreq    =freq1+(numerator*(freq2-freq1));
        if ((i % 1000) == 0) {
            Log.e("Current Freq:", String.format("Freq is:  %f at loop %d of %d", instfreq, i, numSample));
        }
        sample[i]=Math.sin(2*Math.PI*i/(sampleRate/instfreq));

    }
    int idx = 0;
    for (final double dVal : sample) {
        // scale to maximum amplitude
        final short val = (short) ((dVal * 32767)); // max positive sample for signed 16 bit integers is 32767
        // in 16 bit wave PCM, first byte is the low order byte (pcm: pulse control modulation)
        generatedSnd[idx++] = (byte) (val & 0x00ff);
        generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);


    }
    DataOutputStream dd=new DataOutputStream( new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath()+"/tessst.wav" ));       
    dd.writeBytes("RIFF");
    dd.writeInt(48000); // Final file size not known yet, write 0 
    dd.writeBytes("WAVE");
    dd.writeBytes("fmt ");
    dd.writeInt(Integer.reverseBytes(16)); // Sub-chunk size, 16 for PCM
    dd.writeShort(Short.reverseBytes((short) 1)); // AudioFormat, 1 for PCM
    dd.writeShort(Short.reverseBytes( (short) myChannels));// Number of channels, 1 for mono, 2 for stereo
    dd.writeInt(Integer.reverseBytes(sampleRate)); // Sample rate
    dd.writeInt(Integer.reverseBytes( (sampleRate*myBitsPerSample*myChannels/8))); // Byte rate, SampleRate*NumberOfChannels*BitsPerSample/8
    dd.writeShort(Short.reverseBytes((short) (myChannels*myBitsPerSample/8))); // Block align, NumberOfChannels*BitsPerSample/8
    dd.writeShort(Short.reverseBytes( myBitsPerSample)); // Bits per sample
    dd.writeBytes("data");
    dd.write(generatedSnd,0,numSample);
    dd.close();


void playSound(){
    AudioTrack audioTrack= null;
    try{
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length, AudioTrack.MODE_STATIC);
        audioTrack.write(generatedSnd, 0, generatedSnd.length);

        audioTrack.play();

    }
    catch(Exception e)
    {
        System.out.print(e);
    }
}

void excute() throws IOException
{
    long time=Calendar.getInstance().getTimeInMillis();
    playSound();
    time=Calendar.getInstance().getTimeInMillis()-time;
    Log.e("time", String.format(" "+time+" ms"));
}

0 个答案:

没有答案