我将在10秒内录制多个小视频。在创建任何视频之前,我需要一次又一次地准备和启动媒体录制器。因此,每个视频中存在一到两秒的时间滞后。 有没有办法避免像Instagram这样的媒体录音机的这种时间延迟?
public boolean startRecording() {
startCamera();
camera.unlock();
int rotation = 0;
cameraInfo = new CameraInfo();
Camera.getCameraInfo(cameraId, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
rotation = 270;
} else {
rotation = 90;
}
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setOrientationHint(rotation);
mMediaRecorder.setCamera(camera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoEncodingBitRate(1500000);
mMediaRecorder.setVideoSize(640, 480);
File f = new File(cVideoFilePath);
int countNames = 1;
String[] fileNameList = null;
fileNameList = f.list();
for (int i = 0; i < fileNameList.length; i++) {
if (fileNameList[i].contains("TapVid")) {
countNames++;
}
}
updatedFileNumber = countNames;
prRecordedFile = new File(cVideoFilePath + "Vid" + updatedFileNumber
+ ".mp4");
mMediaRecorder.setOutputFile(prRecordedFile.getPath());
mMediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
try {
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (Exception e) {
e.printStackTrace();
releaseMediaRecorder();
return false;
}
return true;
}
答案 0 :(得分:4)
所以Instagram也遭受了MediaRecorder的延迟。你可以告诉你什么时候快速点击。进度条重置。只有当你持有记录按钮的时间超过一秒时,它才真正捕获任何东西。
这只是MediaRecorder的一个固有缺陷。解决这个问题的唯一方法是使用setPreviewCallbackWithBuffer API。在使用此API时,您可以为摄像机提供缓冲区以显示预览,并使用它在预览曲面上显示的YUV帧回调给您。然后,您可以将此缓冲区传递给MediaCodec以对视频进行编码。
理想情况下,OEM已实施MediaCodec以了解从相机传递的缓冲区,但我们在4.3之前的许多设备上看到了不稳定的性能。例如,期望与相机不同的对齐和YUV格式的随机MediaCodec实现。您还必须自己捕获音频并保持AV同步。
或者你可以将缓冲区传递给ffmpeg进行编码 - 只需要注意你构建到ffmpeg中的编解码器。 VP8 + vorbis是我们见过的性能最佳的免版税编解码器。