Android 使用 CamcorderProfile 捕捉慢动作视频

Posted

技术标签:

【中文标题】Android 使用 CamcorderProfile 捕捉慢动作视频【英文标题】:Android capturing slow motion video using CamcorderProfile 【发布时间】:2016-05-09 01:20:19 【问题描述】:

我正在尝试在我的 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 视频。

我浏览了this answer,在official documentation中谈到了以下内容:

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

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

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

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

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

1/4,因为 CamcorderProfile.QUALITY_HIGH_SPEED_HIGH 宣传的帧速率是 120,我想按照文档 here 中的说明捕获 30 fps 的视频

public 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 编码器进行视频录制,它必须设置每个 MediaFormat 的单个字段同样根据此 摄像机配置文件。

【问题讨论】:

只是猜测,但您是否真的尝试手动调用setVideoFrameRatesetVideoEncodingBitRate?您检查过您的个人资料提交的值吗? 是的@damian,在准备之前我会调用以下代码:mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate/4); mMediaRecorder.setVideoFrameRate(profile.videoFrameRate/4); 个人资料videoBitRate27000000videoFrameRate120 嗨,@Siddharth。你有没有想过解决这个问题?我也有同样的问题。 @flutillie 否。无法解决此问题。如果您有任何建议,请发表评论。 @Siddharth 有什么解决方案吗?陷入同样的​​问题。 【参考方案1】:
mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH);

【讨论】:

doc 表示CamcorderProfile.QUALITY_HIGH_SPEED_HIGH 的值是2001。我怀疑我可以将 videoFrameRate 设置为 2001。你能详细说明你的答案吗?

以上是关于Android 使用 CamcorderProfile 捕捉慢动作视频的主要内容,如果未能解决你的问题,请参考以下文章

Android之SharedPreferences使用

想要使用cordova/android禁用android的HardBack按钮

如何在Mac中使用Android SDK

何时使用“?android”或“@android”?

Android 安装包优化Android 中使用 SVG 图片 ( 使用 appcompat 支持库兼容 5.0 以下版本的 Android 系统使用矢量图 )

Android Handler使用