【问题标题】:AudioTrack AudioRecord android issue, silenceAudioTrack AudioRecord android问题,静音
【发布时间】:2017-06-25 07:53:13
【问题描述】:

有谁知道是否需要以特殊的方式/类型的线程、可运行、服务等将音频记录和音轨分开以便能够协同工作?现在我可以开始一个音轨,然后录音没有问题。

但是,如果我在录制时开始和停止音轨,则录音开始输出 0,就好像它被静音了一样。 (但它没有静音或停止)

如果我启动音频记录然后是音轨,那么音频记录也被“静音”。

同样奇怪的是,当我拔下并插入有线耳机时,它会再次开始录制/输出录制而不是 0(这让我觉得我的手机联想 B 和联想 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);

【问题讨论】:

  • 显示代码(初始化、启动、停止等)
  • @VolodymyrKulyk 好的,我做到了:)

标签: android multithreading service audiorecord audiotrack


【解决方案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);
    }
}

【讨论】:

  • 感谢您的代码。你的意思是把除了初始化之外的所有东西都放在私有状态会有所帮助吗?我认为这是一个与访问相关的声明?
  • 不,试试这段代码,私有还是公有取决于你
  • 我知道即使出现问题,录制状态始终是积极的,因为我对已停止的录制器有故障保护,它应该强制重新启动,但它永远不会停止并且永远不会在静音时返回 true .它只是开始输出 0,就像它被静音但我将配置我的代码以具有一个带有记录和轨道的构造函数,并在 while() 中有 RECORDSTATE_RECORDING == audioRecord.getRecordingState() 来查看它是否改变了任何东西然后回复你!我还有一个媒体播放器,它不时初始化并播放警报,这对录音没有影响。再次感谢
猜你喜欢
  • 2014-10-19
  • 2011-06-10
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多