主要的步骤分为视频录制,音频录制,视频合成。
视频录制采用
OpenGLES
渲染预览摄像头画面,通过MediaCodec
创建一个surface
,然后通过创建一个新的egl
环境共享预览的EglContext
和这个surface
绑定,渲染摄像头预览的fbo
绑定的纹理,即可录制。
音频录制采用MediaCodec
即可,从外部传入pcm
数据进行编码录制。
音视频合成采用MediaMuxer
合成。
视频录制
OpenGLES渲染画面通过MediaCodec录制
音频录制
相关参考 MediaCodec硬编码pcm2aac
主要分为以下几步骤:
初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16private void initAudioEncoder(String mineType, int sampleRate, int channel) {
try {
mAudioEncodec = MediaCodec.createEncoderByType(mineType);
MediaFormat audioFormat = MediaFormat.createAudioFormat(mineType, sampleRate, channel);
audioFormat.setInteger(MediaFormat.KEY_BIT_RATE, 96000);
audioFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
audioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 4096);
mAudioEncodec.configure(audioFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mAudioBuffInfo = new MediaCodec.BufferInfo();
} catch (IOException e) {
e.printStackTrace();
mAudioEncodec = null;
mAudioBuffInfo = null;
}
}开始录制
1 |
|
- 传入数据
这里编码为aac
不用添加adts
是因为这里是写入到mp4
,而不是单独的aac
文件
1 |
|
- 停止录制
1 | audioEncodec.stop(); |
音视频合成
有了音视频数据,通过MediaMuxer
进行合并。
官方示例:
1 | //MediaMuxer facilitates muxing elementary streams. Currently MediaMuxer supports MP4, Webm |
主要步骤如下:
- 初始化
1 | mMediaMuxer = new MediaMuxer(savePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); |
- 获取录制音视频的
TrackIndex
1 | int outputBufferIndex = videoEncodec.dequeueOutputBuffer(videoBufferinfo, 0); |
- 开始合成
1 | mediaMuxer.start(); |
- 合成结束,写入头信息
1 | mediaMuxer.stop(); |