关于android:如何在视频系统中捕获和编码音频_Android

How to capture and encode audio in a video system_Android

我正在尝试在 android 中构建一个开源视频系统,因为我们无法访问封闭系统中的数据。在这个系统中,我们可以修改摄像头捕获的原始数据。

我使用 MediaCodec 和 MediaMux 来完成视频数据编码和复用工作,而且效果很好。但我不知道音频部分。我使用 onFramePreview 来获取每一帧并逐帧进行编码/混合工作。但是我如何同时进行音频录制(我的意思是逐帧捕获音频,对其进行编码并将数据发送到 MediaMux)。

我做了一些研究。似乎我们使用audiorecorder来获取音频的原始数据。但是audiorecorder做一个持续的录音工作,我不认为它可以工作。

谁能给我一个提示?谢谢!


像这样创建audioRecorder:

1
2
3
4
5
6
7
8
9
10
11
12
private AudioRecord getRecorderInstance() {
    AudioRecord ar = null;
    try {
        //Get a audiorecord
        int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);            
        ar = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10);
    }
    catch (Exception e) {

    }
    return ar; //Returns null if mic is unavailable
}

为编码和复用准备和发送数据,像这样是单独的线程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MicrophoneInput implements Runnable {
    @Override
    public void run() {
        // Buffer for 200 milliseconds of data, e.g. 400 samples at 8kHz.
        byte[] buffer200ms = new byte[8000 / 10];

        try {
                while (recording) {
                    audioRecorder.read(buffer200ms, 0, buffer200ms.length);

                    //process buffer i.e send to encoder
                    //don't forget to set correct timestamps synchronized with video
                }
        }
        catch(Throwable x) {        
                //  
        }
    }
}