关于 MediaCodec 和 AudioRecord 的使用方法介绍,可以看其它博客:
MediaCodec 实现硬件解码,
使用 AudioRecord 录制 PCM、WAV 文件,AudioTrack 播放 PCM 文件
基本步骤为:
1) Camera、AudioRecord 获取原始图像、声音数据
2) MediaCodec 编码
3) MediaMuxer 合成 MP4 文件
获取原始图像、声音数据
获取图像数据使用 Camera 实现,首先打开 Camera:
mCamera = CameraHelper.openCamera();
if (mCamera == null) {
finish();
}
Camera.Parameters parameters = mCamera.getParameters();
mPreviewSize = CameraHelper.chooseCameraSize(parameters.getSupportedPreviewSizes(), width, height);
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
mPrevieweFormat = parameters.getPreviewFormat();
mCamera.setParameters(parameters);
mCamera.setDisplayOrientation(90);
mCamera.setPreviewCallback(this);
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
Log.e(TAG, "openCamera preview failed: " + e.getLocalizedMessage());
ToastHelper.show("相机预览开启失败!");
releaseCamera();
finish();
}
onPreviewFrame 就是获取原始图像数据的地方:
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (mIsRecording) {
mRecorder.recordImage(data);
}
}
AudioRecord 录制音频:
private class AudioRecordRunnable implements Runnable {
private AudioRecord mAudioRecord;
private int mBufferSize;
private AudioRecordRunnable() {
try {
mChannels = 1;
mBufferSize = AudioRecord.getMinBufferSize(mSampleRate, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, mSampleRate,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, mBufferSize);
} catch (Exception e) {
Log.e(TAG, "init AudioRecord exception: " + e.getLocalizedMessage());
}
if (mAudioRecord == null || mAudioRecord.getState() != AudioRecord.STATE_I