10

我正在尝试在我的 Nexus 5x 上捕捉慢动作视频。这就是我配置媒体记录器的方式:

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH_SPEED_HIGH);

mMediaRecorder = new MediaRecorder();

// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);

// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

// Step 3: Set the high speed CamcorderProfile
mMediaRecorder.setProfile(profile);

// Step 4: Set output file
// Step 5: Prepare media recorder
// Step 6: Capture video

问题是,捕获的视频不是我的设备支持的 120 fps 慢动作视频。它们是常规的 29 fps 视频。

我经历了这个答案,它在官方文档中谈到了以下内容:

对于下面定义的所有高速配置文件((从 QUALITY_HIGH_SPEED_LOW 到 QUALITY_HIGH_SPEED_2160P),它们与普通录制配置文件相似,只是具有更高的输出帧率和比特率。因此,使用 setProfile(CamcorderProfile) 设置这些配置文件而不指定任何其他编码参数将产生高速视频而不是具有不同捕获和输出(播放)帧速率的慢动作视频。 要录制慢动作视频,应用程序必须通过 setVideoFrameRate(int) 和 setVideoEncodingBitRate 适当地设置视频输出(播放)帧速率和比特率(int) 基于慢动作因子。如果应用程序打算使用 MediaCodec 编码器进行视频录制,它必须根据此 CamcorderProfile 类似地设置 MediaFormat 的每个单独字段。

我不明白的是,setProfile已经调用了两个方法 setVideoFrameRate 和 setVideoEncodingBitRate,其参数源自所选的 CamcorderProfile。为什么我需要再次打电话给他们?我在这里想念什么?

任何帮助将不胜感激。为了我的一生,我无法让它工作!

编辑:我尝试过调用这样的方法,但它仍然可以捕获正常速度的视频:

mMediaRecorder.setVideoFrameRate(profile.videoFrameRate/4); 
mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate/4);

1/4,因为 CamcorderProfile.QUALITY_HIGH_SPEED_HIGH 的广告帧速率为 120,我想捕捉 30 fps 的视频,如此处文档中所述

公共 int videoFrameRate

在 API 级别 8 中添加 目标视频帧速率(以每秒帧数为单位)。

如果应用程序通过 setProfile(CamcorderProfile) 配置视频录制而不指定任何其他 MediaRecorder 编码参数,则这是每秒目标录制视频输出帧速率。例如,对于高速质量配置文件(从 QUALITY_HIGH_SPEED_LOW 到 QUALITY_HIGH_SPEED_2160P),这是录制和播放视频的帧速率。如果应用程序打算创建具有高速质量配置文件的慢动作用例,它必须通过 setVideoFrameRate(int) 设置与所需输出(播放)帧速率相对应的不同视频帧速率。例如,如果 QUALITY_HIGH_SPEED_720P 在 CamcorderProfile 中宣传 240fps 的 videoFrameRate,并且应用程序打算创建 1/8 因子慢动作录制视频,则应用程序必须通过 setVideoFrameRate(int) 设置 30fps。否则将导致以正常速度播放帧速率(以上示例为 240fps)的高速视频。如果应用程序打算使用 MediaCodec 编码器进行视频录制,它必须根据此 CamcorderProfile 类似地设置 MediaFormat 的每个单独字段。

4

1 回答 1

-1
mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);

或者

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH);
于 2016-03-02T12:08:44.840 回答