Направьте голосовой буфер с микрофона на динамик в Android - PullRequest
3 голосов
/ 09 марта 2011

Мне нужно увеличить голос, диктофон с микрофона на Android устройстве.Я пытаюсь прочитать буфер из AudioRecord, а затем записать его в AudioTrack ... Это работает, но с задержкой, потому что минимальный размер буфера, возвращенный метод бу AudioRecord.getMinBufferSize с частотой 44100 составляет 4480 байт.

Есть идеи?
Спасибо.

Ответы [ 3 ]

1 голос
/ 21 марта 2011

У меня есть этот код

Задержка AudioRecord и AudioTrack

Но бывает, что есть задержка 20 мс, и мне нужно ее решить, код вышеКажется, что играет что-то, но нет входа микрофона, это работает?

Спасибо!

1 голос
/ 25 июля 2012

Я заметил, что нет потокового кода.Я бы порекомендовал попробовать разделить аспекты записи и воспроизведения и посмотреть, лучше ли избежать задержки.Заполните буфер из микрофона одним потоком и прочитайте его в динамик другого.Избегайте переполнения буфера и опустошения, обрабатывая эти ситуации с некоторыми действиями (например, очистка буфера для переполнения).Теоретически, один должен идти в ногу с другим.

0 голосов
/ 09 марта 2011
package org.example.audio;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class AudioDemo extends Activity implements OnClickListener {
    private static final String TAG = "AudioDemo";
    private static final String isPlaying = "Media is Playing"; 
    private static final String notPlaying = "Media has stopped Playing"; 

    MediaPlayer player;
    Button playerButton;

    public void onClick(View v) {
        Log.d(TAG, "onClick: " + v);
        if (v.getId() == R.id.play) {
            playPause();
        }
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //player = MediaPlayer.create(this, R.raw.robotrock);
        player.setLooping(false); // Set looping

        // Get the button from the view
        playerButton = (Button) this.findViewById(R.id.play);
        playerButton.setText(R.string.stop_label);
        playerButton.setOnClickListener(this);

        // Begin playing selected media
        demoPlay();

        // Release media instance to system
        player.release();
    }

    @Override
    public void onPause() {
        super.onPause();
        player.pause();
    }

    // Initiate media player pause
    private void demoPause(){
        player.pause();
        playerButton.setText(R.string.play_label);
        Toast.makeText(this, notPlaying, Toast.LENGTH_LONG).show();
        Log.d(TAG, notPlaying);
    }

    // Initiate playing the media player
    private void demoPlay(){
        player.start();
        playerButton.setText(R.string.stop_label);
        Toast.makeText(this, isPlaying, Toast.LENGTH_LONG).show();
        Log.d(TAG, isPlaying);
    }

    // Toggle between the play and pause
    private void playPause() {
        if(player.isPlaying()) {
            demoPause();
        } else {
            demoPlay();
        }   
    }
}
...