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 的单个字段同样根据此 摄像机配置文件。
【问题讨论】:
只是猜测,但您是否真的尝试手动调用setVideoFrameRate
和setVideoEncodingBitRate
?您检查过您的个人资料提交的值吗?
是的@damian,在准备之前我会调用以下代码:mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate/4);
mMediaRecorder.setVideoFrameRate(profile.videoFrameRate/4);
个人资料videoBitRate
是27000000
和videoFrameRate
是120
嗨,@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 捕捉慢动作视频的主要内容,如果未能解决你的问题,请参考以下文章
想要使用cordova/android禁用android的HardBack按钮
Android 安装包优化Android 中使用 SVG 图片 ( 使用 appcompat 支持库兼容 5.0 以下版本的 Android 系统使用矢量图 )