微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Java 上读取录制的音频作为 WAV 文件进行音频处理?

如何解决如何在 Java 上读取录制的音频作为 WAV 文件进行音频处理?

我想读取我录制的 wav 文件并将其用于信号处理,处理方法如下:

//SIGNAL PROCESSING
private void proccessSignal(double[] signalIN){

    double samplefreq = 44100;
    double[] signal = signalIN;
    Bessel bandpassfilter = new Bessel(signal,samplefreq);
    double[] filteredSignal = bandpassfilter.lowPassFilter(1,150);
    Bessel newsignalfiltered = new Bessel(filteredSignal,samplefreq);
    double[] needsAmplifianceSignal = newsignalfiltered.bandPassFilter(1,200,500);
    double[] amplifiedSignal = needsAmplifianceSignal;
    for (int i=0;i<=needsAmplifianceSignal.length;i++){
        amplifiedSignal[i]=amplifiedSignal[i]*1000;
        amplifiedSignal[i]=amplifiedSignal[i]*amplifiedSignal[i];
    }

    Hilbert h = new Hilbert(amplifiedSignal);
    h.hilbertTransform();
    double[][] analytical_signal = h.getoutput();
    Log.d("Endsignal","proccessSignal: "+analytical_signal);


    double threshold = 0.0052;
    int apneaCount = 0;

    for (int i=0; i<=analytical_signal.length;i++)
    {
        for (int j=0; j<=analytical_signal.length;j++){
            if (threshold<=analytical_signal[i][j]){

            }else {
                apneaCount++;
                if (apneaCount>=10){
                    apneaview.setText("YOU HAVE APNEA,CONTACT YOUR DOCTOR");
                    break;
                }
            }
        }

    }
    if (apneaCount < 10){
        apneaview.setText("YOU DO NOT HAVE APNEA");
    }
    

}

录音和一切正常,但信号似乎始终为空,所以它永远不会进入我的处理方法,这是我的 Logcat 以获取有关此问题的详细信息:

  • W/System.err: com.github.psambit9791.wavfile.WavFileException: Wav Header 数据无效,riff 块 ID 不正确
  • W/System.err:位于 com.github.psambit9791.wavfile.WavFile.openWavFile(WavFile.java:257)
  • W/System.err:位于 com.github.psambit9791.jdsp.io.Wav.readWav(Wav.java:70)
  • W/System.err:在 com.example.appnea.DetailedStat.onCreate(DetailedStat.java:82)

为了更好地理解,这里是完整的活动:

// TEST
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detailed_stat);
    Intent receivedFromList = getIntent();
    name = receivedFromList.getStringExtra("recordName");
    path = receivedFromList.getStringExtra("recordpath");
    nameview = findViewById(R.id.NAME);
    pathview = findViewById(R.id.PATH);
    apneaview = findViewById(R.id.APNEA);


    nameview.setText("Record date: " + name);
    pathview.setText("Record path: " + path);
    apneaview.setText("INITIALISING DATA");


    File audiofile = new File(path);
    double[] signal = new double[0];
    try {
        String mMime = "audio/3gpp";
        MediaCodec codec = MediaCodec.createDecoderByType(mMime);

        /**
         *
         *
         */

        Wav objRead1 = new Wav();
        objRead1.readWav(path);
        Hashtable<String,Long> propsOut = objRead1.getProperties(); // Gets the WAV file properties
        double[][] signal1 = objRead1.getData("int"); // Can be 'int','long' 'double'


        try {
            loadFFMpegLibrary();
        } catch (FFmpegNotSupportedException e) {
            e.printstacktrace();
        }


        MediaExtractor mx = new MediaExtractor();

        try {
            mx.setDataSource(path);
        } catch (IOException e) {
            e.printstacktrace();
        }

        /**
         * Finals
         */

        
        MediaFormat mMediaFormat = mx.getTrackFormat(0);

        byte[] bufbytes = new byte[(int) audiofile.length()];

        BufferedInputStream buf = new BufferedInputStream(new FileInputStream(audiofile));

        buf.read(bufbytes,bufbytes.length);
        buf.close();
        mMediaFormat.setByteBuffer("3gp",ByteBuffer.wrap(bufbytes));


        codec.setCallback(new MediaCodec.Callback() {
            @Override
            public void onInputBufferAvailable(@NonNull MediaCodec codec,int index) {

            }

            @Override
            public void onOutputBufferAvailable(@NonNull MediaCodec codec,int index,@NonNull MediaCodec.BufferInfo info) {

            }

            @Override
            public void onError(@NonNull MediaCodec codec,@NonNull MediaCodec.CodecException e) {

            }

            @Override
            public void onOutputFormatChanged(@NonNull MediaCodec codec,@NonNull MediaFormat format) {

            }
        });

        codec.configure(mMediaFormat,null,0);
        codec.start();

        new Thread(() -> {

            MediaCodec.BufferInfo buf_info = new MediaCodec.BufferInfo();
            int outputBufferIndex = codec.dequeueOutputBuffer(buf_info,0);
            byte[] pcm = new byte[buf_info.size];

            ByteBuffer[] mOutputBuffers = new ByteBuffer[buf_info.size];
            mOutputBuffers[outputBufferIndex].get(pcm,buf_info.size);


        }).start();

        sampleDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"/OfficeRecordings/");
        if (!sampleDir.exists()) {
            sampleDir.mkdirs();
        }

        outputFile =  sampleDir+"/"+"sample_record.3gp";

        finalFile =  sampleDir+"/"+"final_record.wav";

        final String[] cmd = new String[]{"-y","-i",outputFile,finalFile};


        execFFmpegBinary(cmd);


    } catch (IOException | WavFileException e) {
        e.printstacktrace();
    }
    Log.d("AUdio","onCreate: AUdio FILE EXIST?" + audiofile.exists());





    //proccessSignal(signal);



}


private void execFFmpegBinary(final String[] command) {

    FFmpeg ffmpeg = FFmpeg.getInstance(this);
    try {
        ffmpeg.loadBinary(new LoadBinaryResponseHandler() {

            @Override
            public void onStart() {
                Log.d("audio","starting to load binary");
            }

            @Override
            public void onFailure() {
                Log.d("audio","Failed to load binary");
            }

            @Override
            public void onSuccess() {
                Log.d("audio","loaded binary");
                try {

                    ffmpeg.execute(cmd,new ExecuteBinaryResponseHandler() {

                        @Override
                        public void onStart() {
                            Log.d("audio"," starting to get audio " + "");

                        }

                        @Override
                        public void onProgress(String message) {
                            Log.d("audio"," progress getting audio from ");

                        }

                        @Override
                        public void onFailure(String message) {
                            Log.d("audio"," Failed to get audio ");

                        }

                        @Override
                        public void onSuccess(String message) {
                            Log.d("audio"," success getting audio from video");
                        }

                        @Override
                        public void onFinish() {


                        }
                    });
                } catch (FFmpegCommandAlreadyRunningException e) {

                    e.printstacktrace();
                }
            }

            @Override
            public void onFinish() {
            }
        });
    } catch (FFmpegNotSupportedException e) {
        // Handle if FFmpeg is not supported by device
    }
}

// TRYING THE FFMPEG METHOD
public void loadFFMpegLibrary() throws FFmpegNotSupportedException {
    if (fFmpeg == null)
        fFmpeg = FFmpeg.getInstance(this);

    fFmpeg.loadBinary(new FFmpegLoadBinaryResponseHandler() {
        @Override
        public void onFailure() {
            Toast.makeText(getApplicationContext(),"Library Failed to load",Toast.LENGTH_LONG).show();
        }

        @Override
        public void onSuccess() {
            Toast.makeText(getApplicationContext(),"Library loaded successfully",Toast.LENGTH_LONG).show();

        }

        @Override
        public void onStart() {

        }

        @Override
        public void onFinish() {

        }
    });

}
public  void executeCommand(final String[] command) throws FFmpegCommandAlreadyRunningException {
    fFmpeg.execute(command,new ExecuteBinaryResponseHandler() {
        @Override
        public void onSuccess(String message) {

        }

        @Override
        public void onProgress(String message) {

        }

        @Override
        public void onFailure(String message) {

        }

        @Override
        public void onStart() {

        }

        @Override
        public void onFinish() {

        }
    });
}


//CONVERTING TO DOUBLE ARRAY FROM BYTEARRAY
public static double[] todoubleArray(byte[] byteArray){
    int times = Double.SIZE / Byte.SIZE;
    double[] doubles = new double[byteArray.length / times];
    for(int i=0;i<doubles.length;i++){
        doubles[i] = ByteBuffer.wrap(byteArray,i*times,times).getDouble();
    }
    return doubles;
}
private void copyFile(InputStream in,OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1){
        out.write(buffer,read);
    }
}

//SIGNAL PROCESSING
private void proccessSignal(double[] signalIN){

    double samplefreq = 44100;
    double[] signal = signalIN;
    Bessel bandpassfilter = new Bessel(signal,CONTACT YOUR DOCTOR");
                    break;
                }
            }
        }

    }
    if (apneaCount < 10){
        apneaview.setText("YOU DO NOT HAVE APNEA");
    }
    

}

}

非常感谢您抽出宝贵时间,我真的很感激。如果您需要任何其他信息,请告诉我!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。