我正在编写我的第一个android应用程序,并且我的应用程序具有视频录制功能。因此,我进行了一些研究,以使“材料”准备就绪并运行,并设法查看了github上的google示例: https://github.com/googlesamples/android-Camera2Video
所以我深入研究了代码,是的,只是制作了一段视频。
所以我确实对我的相机功能有一些限制,那就是它以每秒25帧的稳定恒定速度平稳运行...
到目前为止,我所看到的是MediaRecorder类中的一些设置方法(请参见https://developer.android.com/reference/android/media/MediaRecorder.html)
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setOutputFile(mNextVideoAbsolutePath);
mMediaRecorder.setVideoEncodingBitRate(10000000);
mMediaRecorder.setCaptureRate(25);
mMediaRecorder.setVideoFrameRate(25);
mMediaRecorder.setVideoSize(mVideoSize.getWidth(), getHeight());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
设置帧速率,但是这些帧给我的25 fps带来了该死的-所以通常输出“就像” 29,36 fps或29,54 fps
我确实对我的设备支持fps范围进行了一些研究,而P30 Pro确实支持25 fps,而像素3 XL不支持。我什至不明白为什么会有这样的设备差异(也许有人可以解释?)。
Camera2 API确实提供了很多东西,以至于有了CaptureRequest.Builder,因此我进行了一些搜索,并为我的captureRequestBuilder设置了这些额外的行
closePreviewSession();
setUpMediaRecorder();
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
mPreviewBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<Integer>(25,25));
mPreviewBuilder.set(
CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
mPreviewBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
但是什么都没有改变...外面有人通过camera2 api设法获得了稳定的恒定帧率吗?
我希望有!谢谢,如果您到目前为止已经读过!
编辑:可能的重复项:
Camera2 MediaRecorder changes Frame Rate on Galaxy S9
How to use android camera2 api to record 60 fps video with fixed exposure time
编辑:出于完整性考虑:
P30 Pro的范围: P30 Pro ranges
Pixel 3 XL的范围: Pixel 3 XL ranges