Android AudioTrack playing .wav file, getting only white noise

前端 未结 3 1640
渐次进展
渐次进展 2020-11-30 07:08

When I play a file with the following code:

private void PlayAudioFileViaAudioTrack(int ResId) throws IOException {

    int intSize = android.media.AudioT         


        
相关标签:
3条回答
  • 2020-11-30 07:30

    from your code i can see that you just read data from the wav file and just import them to the AudioTrack. Wav files have a small header as you can see here https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ So you have to skip the header and point your file descriptor at the right place where the actual audio data are.

    Also when you playing an audio file and you are dealing with byte operations you should take care of the Endianess. Take a look here Using AudioTrack in Android to play a WAV file

    Below my code (some checks and the WAV header skip are missing) that works in both Nexus One and Galaxy S with a wav file with frequency 8000Hz and 16 bit encoding.

    public void playWav(){
        int minBufferSize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
        int bufferSize = 512;
        AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
        String filepath = Environment.getExternalStorageDirectory().getAbsolutePath();
    
        int i = 0;
        byte[] s = new byte[bufferSize];
        try {
            FileInputStream fin = new FileInputStream(filepath + "/REFERENCE.wav");
            DataInputStream dis = new DataInputStream(fin);
    
            at.play();
            while((i = dis.read(s, 0, bufferSize)) > -1){
                at.write(s, 0, i);
    
            }
            at.stop();
            at.release();
            dis.close();
            fin.close();
    
        } catch (FileNotFoundException e) {
            // TODO
            e.printStackTrace();
        } catch (IOException e) {
            // TODO
            e.printStackTrace();
        }       
    }
    
    0 讨论(0)
  • 2020-11-30 07:42

    That looks WAY more complicated than what I did. I played sounds using this. I think .wav files would work just as well.

    MediaPlayer mpPlayProgram = new MediaPlayer();
    mpPlayProgram.setDataSource("/sdcard/file.mp3");
    mpPlayProgram.prepare();
    mpPlayProgram.start();
    mpPlayProgram.release();
    

    For static resources, it's even easier:

    MediaPlayer mpStart = MediaPlayer.create(this, resID);
    mpStart.start();
    mpStart.release();
    
    0 讨论(0)
  • 2020-11-30 07:52

    If you have saved file in wav format and want to play it using AudioTrack then follow this code:

                 File file=new File(Environment.getExternalStorageDirectory()+"/AudioRecorder/fahim.wav");
    
                   InputStream is;
                 DataInputStream         dis = null ;
                 BufferedInputStream     bis;
    
                try 
                {
                    is = new FileInputStream(file);
                    bis = new BufferedInputStream(is, 8000);
                    dis  = new DataInputStream(bis);      //  Create a DataInputStream to read the audio data from the saved file
    
                }
                catch (FileNotFoundException e1) 
                {
                    ShowToast("fILE NOT FOUND:"+e1.getMessage());
                }
    
                int i = 0;                                                          //  Read the file into the "music" array
                music=new byte[(int) file.length()];
                try 
                {
                    while (dis.available() > 0)
                    {
                        music[i] = dis.readByte();                                      //  This assignment does not reverse the order
                        i++;
                    }
                } 
                catch (IOException e) 
                {
                    ShowToast("I/O Exception:"+e.getMessage());
                }
    
                try {dis.close();} catch (IOException e) {e.printStackTrace();}
    
                int minBufferSize = AudioTrack.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
    
                AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
                at.play();
    
                ShowToast("size:"+music.length);
                //*/
                at.write(music, 0, music.length);
    
    0 讨论(0)
提交回复
热议问题