AudioTrack没有正确播放音频文件,因为它会产生噪音

时间:2014-08-30 21:30:18

标签: android audio audiotrack

我使用媒体播放器成功录制了用户的声音,文件存储在SD卡中。 现在我想用音轨播放那个声音。但是,当我这样做是在制造噪音。 是的。?

以下是播放声音的代码..

private void PlayAudioFileViaAudioTrack(String filePath) throws IOException
    {
    // We keep temporarily filePath globally as we have only two sample sounds now..
    if (filePath==null)
    return;

    int intSize = android.media.AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
    AudioFormat.ENCODING_PCM_16BIT); 

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
    AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM); 


    if (at==null){ 
    Log.d("TCAudio", "audio track is not initialised ");
    return; 
    }

    int count = 512 * 1024; // 512 kb
    //Reading the file..
    byte[] byteData = null; 
    File file = null; 
    file = new File(filePath);

    byteData = new byte[(int)count];
    FileInputStream in = null;
    try {
    in = new FileInputStream( file );

    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    int bytesread = 0, ret = 0;
    int size = (int) file.length();
    at.play();
    while (bytesread < size) { ret = in.read( byteData,0, count); if (ret != -1) { // Write the byte array to the track 

        at.write(byteData,0, ret); bytesread += ret; } else break; } in.close(); at.stop(); at.release(); }

2 个答案:

答案 0 :(得分:1)

噪音可能是由于缓冲区很小。

尝试:

int intSize = android.media.AudioTrack.getMinBufferSize(44100,
AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
init *= 2;

如果您使用的是最小缓冲区大小,则可能会产生噪音。拥有最小尺寸的两倍是一种很好的做法(根据我的经验)。

答案 1 :(得分:0)

我刚刚通过添加缓冲区大小来解决这个问题并检查此代码,这将解决您的问题。

     void playRecord(int position) {
    if (position==0){
        m=8000;
        String folder_main = "MyVoiceChanger";
        File filee = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + folder_main + "/Recording.mp3");
        int shortSizeInBytes = Short.SIZE / Byte.SIZE;
        int bufferSizeInBytes = (int) (filee.length() / shortSizeInBytes);
        short[] audioData = new short[bufferSizeInBytes];
        try {
                InputStream inputStream = new FileInputStream(filee);
                BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
                DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);
                    int i = 0;
                    while (dataInputStream.available() > 0) {
                        try {
                            audioData[i] = dataInputStream.readShort();
                            i++;
                        }catch (EOFException e){
                            e.printStackTrace();
                        }
                    }
                dataInputStream.close();
                try {
                    bufferSizeInBytes = AudioTrack.getMinBufferSize(
                            m,
                            RECORDER_CHANNELS,
                            RECORDER_AUDIO_ENCODING
                    );
                    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                       AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM);
                    Log.i("Buffer", "playRecord: "+bufferSizeInBytes);
                    final int finalBufferSizeInBytes = bufferSizeInBytes;
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            audioTrack = new AudioTrack(3, m, 2, 2, finalBufferSizeInBytes, 1);
                            try {
                                audioTrack.play();
                                Log.i("Usman", "Audio "+audioTrack);
                            }catch (Exception e){
                                e.printStackTrace();
                            }
                        }
                    });
                }catch (Exception e){
                    e.printStackTrace();
                }
                mediaPlayer.prepareAsync();
                audioTrack.write(audioData, 0, bufferSizeInBytes);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

 }
相关问题