AudioTrack AudioRecord проблема с андроидом, тишина

Кто-нибудь знает, есть ли необходимость в том, чтобы аудиозапись и аудиодорожка были разделены особым образом/типом потока, исполняемым, сервисным и т. д., чтобы они могли работать вместе? Теперь я могу запустить аудиодорожку, затем аудиозапись без проблем.

Но если я запускаю и останавливаю аудиодорожку во время записи, аудиозапись начинает выводить 0, как если бы она была отключена. (Но он не отключен и не остановлен)

Если я запускаю аудиозапись, то аудиодорожка затем аудиозапись также «заглушается».

Также странно то, что, когда я отключаю и подключаю свою проводную гарнитуру, она снова начинает запись/вывод записи, отличную от 0 (что заставляет меня думать, что мои телефоны Lenovo B и Lenovo C2 слишком дешевы (проблемы схемы/оборудования) или имеют проблемы со сборкой ) но я не знаю.

Кто-нибудь слышал об этой проблеме с внезапно «заглушенной» аудиозаписью или аудиозаписью, которая реагирует на отключение/подключение проводной гарнитуры без применения к ней каких-либо настроек/методов?


Обновление кода

class myRecordAndPlayer(){

public void initiateRecorder() {
    if(audio.getMode()!=AudioManager.MODE_IN_CALL) {
        audio.setMode(AudioManager.MODE_IN_CALL);
        //audio.setSpeakerphoneOn(false); for mode in com (mode in com produces more echo/crosstalk)
    }

    rec = true;
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
            AudioRecord audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) * 10);
            try {
                audioRecorder.startRecording();
                while (rec) {
                    bytes_read = audioRecorder.read(buf_audio, 0, buf_audio_len);


public void initiatePlayer() {
    if(!play) {
        play = true;
        android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
        Thread receiveThread = new Thread(new Runnable() {
            @Override
            public void run() {
                AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, BUF_SIZE, AudioTrack.MODE_STREAM);
                track.play();
                try {
                    while(play) {
                        track.write(bufToPlay, 0, bufToPlay.length);

person Kristian Martinsen    schedule 25.06.2017    source источник
comment
показать код (инициализация, запуск, остановка и т. д.)   -  person Volodymyr Kulyk    schedule 25.06.2017
comment
@VolodymyrKulyk Хорошо, я сделал :)   -  person Kristian Martinsen    schedule 25.06.2017


Ответы (1)


Не испытано.

private Thread audioRecordThread
private AudioRecord audioRecorder;
private AudioTrack audioTrack;

public void initialize() {
    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, BUF_SIZE, AudioTrack.MODE_STREAM);

    audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                    AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) * 10);

    audioRecordThread = new Thread(new Runnable() {
            public void run() {
                writeAudioDataToAudioTrack();
            }
        });
}

public void start() {
    audioTrack.play();
    audioRecorder.startRecording();
    audioRecordThread.start();
}

private void writeAudioDataToAudioTrack() {
    while(AudioRecord.RECORDSTATE_RECORDING == audioRecord.getRecordingState()) {
        audioTrack.write(bufToPlay, 0, bufToPlay.length);
    }
}
person Volodymyr Kulyk    schedule 25.06.2017
comment
Спасибо за код. Вы имеете в виду, что это поможет поместить все, кроме инициализации, в приват? Я думал, что это объявление, связанное с доступом? - person Kristian Martinsen; 25.06.2017
comment
Нет, просто попробуйте этот код, частный или общедоступный, зависит от вас - person Volodymyr Kulyk; 25.06.2017
comment
Я знаю, что состояние записи всегда положительное, даже если возникает проблема, так как у меня есть отказоустойчивость для остановленного рекордера, который должен принудительно запуститься снова, но он никогда не останавливается и никогда не дает true при отключении звука. Он просто начинает выводить 0, как будто он отключен. Но я настрою свой код так, чтобы он имел конструктор с записью и дорожкой, а также RECORDSTATE_RECORDING == audioRecord.getRecordingState() в while(), чтобы посмотреть, изменится ли что-нибудь, а затем вернуться к вам! У меня также есть медиаплеер, который время от времени инициализируется и воспроизводит сигнал тревоги, и это не влияет на аудиозапись. еще раз спасибо - person Kristian Martinsen; 25.06.2017