Android 使用 CamcorderProfile 捕捉慢动作视频



我正在尝试在我的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( 基于 慢动作因子。如果应用程序打算制作视频 使用媒体编解码器编码器录制,它必须设置每个单独的字段 的媒体格式类似地根据此摄像机配置文件。

我不明白的是,setProfile 已经调用了两个方法 setVideoFrameRate 和 setVideoEncodingBitRate 使用从所选 CamcorderProfile 派生的参数。为什么我需要再次致电他们?我在这里错过了什么?

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

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

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

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

public int videoFrameRate

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

这是每秒目标录制的视频输出帧速率,如果 应用程序通过以下方式配置视频录制 setProfile(CamcorderProfile(,而不指定任何其他 媒体记录器编码参数。例如,对于高速质量 配置文件(从QUALITY_HIGH_SPEED_LOW到QUALITY_HIGH_SPEED_2160P(, 这是录制和播放视频的帧速率 跟。如果应用程序打算创建慢动作用例 高速画质的配置文件,它必须设置不同的视频帧 对应于所需输出(播放(帧速率的速率 via setVideoFrameRate(int(.例如,如果QUALITY_HIGH_SPEED_720P 在摄像机配置文件中宣传 240fps 视频帧速率,以及 应用程序打算创建 1/8 因子慢动作录制视频, 应用程序必须通过 setVideoFrameRate(int( 设置 30fps。未能 这样做将导致具有正常速度播放的高速视频 帧速率(上面的例子为 240fps(。如果应用程序打算 使用媒体编解码器编码器进行视频录制,它必须设置每个 媒体格式的个别字段同样根据此 摄像机配置文件。

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH);

最新更新