我正在 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;
}
因此 Instagram 也遭受了 MediaRecorder 延迟的困扰。您可以判断何时进行快速点击。进度条重置。只有当您按住录制按钮超过一秒时,它才会真正捕获任何内容。
这只是 MediaRecorder 的固有缺陷。解决这个问题的唯一方法是使用 setPreviewCallbackWithBuffer API。在使用此 API 时,您为相机提供缓冲区来显示预览,并且它会向您回调在预览表面上显示的 YUV 帧。然后,您可以将此缓冲区传递给 MediaCodec 对视频进行编码。
理想情况下,OEM 已实现 MediaCodec 来了解从相机传递的缓冲区,但我们在 4.3 之前的许多设备上看到了不稳定的性能。例如,随机 MediaCodec 实现期望与相机提供的对齐方式和 YUV 格式不同。您还必须自己捕获音频并保持 AV 同步。
或者,您可以将缓冲区传递给 ffmpeg 进行编码 - 只是要小心您在 ffmpeg 中构建的编解码器。 VP8 + vorbis 是我们见过的性能最好的免版税编解码器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)