AudioTrack не воспроизводит аудиофайл должным образом, так как вместо этого он издает шум

Я успешно записал голос пользователя с помощью медиаплеера, и файл хранится на SD-карте. теперь я хочу воспроизвести этот голос, используя звуковую дорожку. Но когда я это делаю, он шумит. Y так.?

Вот код для воспроизведения звука ..

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(); }

person Workaholic    schedule 30.08.2014    source источник
comment
Определите создание шума ...   -  person Kenny Worden    schedule 31.08.2014
comment
шум Вы можете сказать, что он создает сильные искажения звука, он не воспроизводит голос четко.   -  person Workaholic    schedule 31.08.2014


Ответы (2)


Шум мог быть из-за небольшого буфера.

Пытаться:

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

Если вы работаете с точно минимальным размером буфера, это может привести к зашумлению звука. По моему опыту, иметь вдвое меньший минимальный размер - это хорошая практика.

person Herve    schedule 06.09.2014

Я только что решил эту проблему, добавив размер буфера, и проверил этот код, это решит вашу проблему.

     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();
            }
    }

 }
person Usman Ali    schedule 13.03.2018