首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullPointer异常:尝试在空对象引用上调用虚拟方法'int com.musicg.wave.WaveHwader.getSampleRate()‘

NullPointer异常:尝试在空对象引用上调用虚拟方法'int com.musicg.wave.WaveHwader.getSampleRate()‘
EN

Stack Overflow用户
提问于 2018-10-09 18:44:38
回答 1查看 370关注 0票数 0

我试图从github运行代码,但是我的应用程序崩溃了。这段代码比较使用麦克风输入的音乐&比较使用musicg的应用程序中的音频和数据库。

它有两个gui按钮,一个开始和另一个停止。

启动-将从麦克风输入。

停止-将停止录音从麦克风&比较是否在其中的音频存在。

当我尝试在我的手机上运行应用程序并按下按钮,应用程序崩溃&给我错误。

有人能帮我解决这个问题。

谢谢:)

误差

代码语言:javascript
复制
java.Iang.NullPointerException:
Attempt to invoke virtual method 'int
com.musicg.wave.WaveHeader.getSampIeRate()' on
a null object reference

at
com.musicg.fingerprint.FingerprintManager.extractFingerprint(FingerprintManager.java:69)

at
com.musicg.wave.Wave.getFingerprint(Wave.java:
329)

at
com.musicg.wave.Wave.getFingerprintSimilarity(Wave.java:335)

at
com.example.tanmay.androidmusicg.MainActivity.co
mpareTempFiIe(MainActivity.java:175)

at
com.example.tanmay.androidmusicg.MainActivity.st
opRecording(MainActivity.java:166)

at
com.example.tanmay.androidmusicg.MainActivity.ac
cess$400(MainActivity.java:26)

at
com.example.tanmay.androidmusichainActivitySZ.
onCIick(MainActivity.java:290)

at android.view.View.performCIick(View.java:6312)

at android.view.View$PerformC|ick.run(View.java:
24811)

at android.os.HandIer.hand|eCa||back(Hand|er.java:
790)

at
android.os.Hand|er.dispatchMessage(Hand|er.java:
99)

at android.os.Looper.|oop(Looper.java:171)

谢谢。:)

代码:-

代码语言:javascript
复制
package com.example.tanmay.androidmusicg;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import com.musicg.fingerprint.FingerprintManager;
import com.musicg.fingerprint.FingerprintSimilarity;
import com.musicg.fingerprint.FingerprintSimilarityComputer;
import com.musicg.wave.Wave;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import se.marteinn.utils.logging.AppLog;

public class MainActivity extends Activity {
private static final int RECORDER_BPP = 16;
private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private double currentTime;
private AudioRecord recorder = null;
private int bufferSize = 0;
private Thread recordingThread = null;
private boolean isRecording = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setButtonHandlers();
    enableButtons(false);
    bufferSize = AudioRecord.getMinBufferSize(8000,
    AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

}

private void setButtonHandlers() {
    ((Button)findViewById(R.id.btnStart)).setOnClickListener(btnClick);
    ((Button)findViewById(R.id.btnStop)).setOnClickListener(btnClick);
}

private void enableButton(int id,boolean isEnable){
    ((Button)findViewById(id)).setEnabled(isEnable);
}

private void enableButtons(boolean isRecording) {
    enableButton(R.id.btnStart,!isRecording);
    enableButton(R.id.btnStop,isRecording);
}

private String getFilename(){
    String filepath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(filepath,AUDIO_RECORDER_FOLDER);

    if(!file.exists()){
        file.mkdirs();
    }

    return (file.getAbsolutePath() + "/" + currentTime + AUDIO_RECORDER_FILE_EXT_WAV);
}

private String getTempFilename(){
    String filepath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(filepath,AUDIO_RECORDER_FOLDER);

    if(!file.exists()){
        file.mkdirs();
    }

    File tempFile = new File(filepath,AUDIO_RECORDER_TEMP_FILE);

    if(tempFile.exists())
        tempFile.delete();

    return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE);
}

private void startRecording(){
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);

    int i = recorder.getState();
    if(i==1)
        recorder.startRecording();

    isRecording = true;

    recordingThread = new Thread(new Runnable() {

        @Override
        public void run() {
            writeAudioDataToFile();
        }
    },"AudioRecorder Thread");

    recordingThread.start();
}

private void writeAudioDataToFile(){
    byte data[] = new byte[bufferSize];
    String filename = getTempFilename();
    FileOutputStream os = null;

    try {
        os = new FileOutputStream(filename);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    int read = 0;

    if(null != os){
        while(isRecording){
            read = recorder.read(data, 0, bufferSize);

            if(AudioRecord.ERROR_INVALID_OPERATION != read){
                try {
                    os.write(data);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private void stopRecording(){
    if(null != recorder){
        isRecording = false;

        int i = recorder.getState();
        if(i==1)
            recorder.stop();
        recorder.release();

        recorder = null;
        recordingThread = null;
    }

    copyWaveFile(getTempFilename(),getFilename());
    compareTempFile();
}

private void compareTempFile() {
    File file = new File(getTempFilename());
    Wave w1 = new Wave(getResources().openRawResource(R.raw.tj));
    Wave w2 = new Wave(file.getPath());
    FingerprintSimilarity fps = w1.getFingerprintSimilarity(w2);
    float score = fps.getScore();
    float sim = fps.getSimilarity();
    AppLog.i(sim+" tj");
}

private void copyWaveFile(String inFilename,String outFilename){
    FileInputStream in = null;
    FileOutputStream out = null;
    long totalAudioLen = 0;
    long totalDataLen = totalAudioLen + 36;
    long longSampleRate = RECORDER_SAMPLERATE;
    int channels = 2;
    long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8;

    byte[] data = new byte[bufferSize];

    try {
        in = new FileInputStream(inFilename);
        out = new FileOutputStream(outFilename);
        totalAudioLen = in.getChannel().size();
        totalDataLen = totalAudioLen + 36;

        AppLog.i("File size: ",totalDataLen);

        WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
                longSampleRate, channels, byteRate);

        while(in.read(data) != -1){
            out.write(data);
        }

        in.close();
        out.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void WriteWaveFileHeader(
        FileOutputStream out, long totalAudioLen,
        long totalDataLen, long longSampleRate, int channels,
        long byteRate) throws IOException {

    byte[] header = new byte[44];

    header[0] = 'R';  // RIFF/WAVE header
    header[1] = 'I';
    header[2] = 'F';
    header[3] = 'F';
    header[4] = (byte) (totalDataLen & 0xff);
    header[5] = (byte) ((totalDataLen >> 8) & 0xff);
    header[6] = (byte) ((totalDataLen >> 16) & 0xff);
    header[7] = (byte) ((totalDataLen >> 24) & 0xff);
    header[8] = 'W';
    header[9] = 'A';
    header[10] = 'V';
    header[11] = 'E';
    header[12] = 'f';  // 'fmt ' chunk
    header[13] = 'm';
    header[14] = 't';
    header[15] = ' ';
    header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
    header[17] = 0;
    header[18] = 0;
    header[19] = 0;
    header[20] = 1;  // format = 1
    header[21] = 0;
    header[22] = (byte) channels;
    header[23] = 0;
    header[24] = (byte) (longSampleRate & 0xff);
    header[25] = (byte) ((longSampleRate >> 8) & 0xff);
    header[26] = (byte) ((longSampleRate >> 16) & 0xff);
    header[27] = (byte) ((longSampleRate >> 24) & 0xff);
    header[28] = (byte) (byteRate & 0xff);
    header[29] = (byte) ((byteRate >> 8) & 0xff);
    header[30] = (byte) ((byteRate >> 16) & 0xff);
    header[31] = (byte) ((byteRate >> 24) & 0xff);
    header[32] = (byte) (2 * 16 / 8);  // block align
    header[33] = 0;
    header[34] = RECORDER_BPP;  // bits per sample
    header[35] = 0;
    header[36] = 'd';
    header[37] = 'a';
    header[38] = 't';
    header[39] = 'a';
    header[40] = (byte) (totalAudioLen & 0xff);
    header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
    header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
    header[43] = (byte) ((totalAudioLen >> 24) & 0xff);

    out.write(header, 0, 44);

}

private View.OnClickListener btnClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.btnStart:{
                AppLog.i("Start Recording");
                currentTime = System.currentTimeMillis();

                enableButtons(true);
                startRecording();

                break;
            }
            case R.id.btnStop:{

                AppLog.i("Stop Recording");

                enableButtons(false);
                stopRecording();

                break;
            }
        }
    }
};
}
EN

回答 1

Stack Overflow用户

发布于 2018-10-09 19:51:26

getTempFilename()方法的问题似乎是直接与这些行有关:

代码语言:javascript
复制
if(tempFile.exists())
        tempFile.delete();

在调用getTempFilename()方法为AudioRecord对象创建文件时:

代码语言:javascript
复制
    private void writeAudioDataToFile(){
        byte data[] = new byte[bufferSize];
        String filename = getTempFilename();
        FileOutputStream os = null;
        ...

并且调用相同的getTempFilename()方法来比较临时文件:

代码语言:javascript
复制
private void compareTempFile() {
    File file = new File(getTempFilename());
    Wave w1 = new Wave(getResources().openRawResource(R.raw.tj));
    Wave w2 = new Wave(file.getPath());
    FingerprintSimilarity fps = w1.getFingerprintSimilarity(w2);
    float score = fps.getScore();
    float sim = fps.getSimilarity();
    AppLog.i(sim+" tj");
}

每次调用getTempFilename()方法时,它都会创建一个新文件,这就是获得NullPointerException的原因。

尝试重构您的代码,以便每个记录比较会话创建一个临时文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52727479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档